Registers.hpp revision 1.16.2.2 1 1.16.2.2 rmind //===----------------------------- Registers.hpp --------------------------===//
2 1.16.2.2 rmind //
3 1.16.2.2 rmind // The LLVM Compiler Infrastructure
4 1.16.2.2 rmind //
5 1.16.2.2 rmind // This file is dual licensed under the MIT and the University of Illinois Open
6 1.16.2.2 rmind // Source Licenses. See LICENSE.TXT for details.
7 1.16.2.2 rmind //
8 1.16.2.2 rmind //
9 1.16.2.2 rmind // Models register sets for supported processors.
10 1.16.2.2 rmind //
11 1.16.2.2 rmind //===----------------------------------------------------------------------===//
12 1.16.2.2 rmind #ifndef __REGISTERS_HPP__
13 1.16.2.2 rmind #define __REGISTERS_HPP__
14 1.16.2.2 rmind
15 1.16.2.2 rmind #include <cassert>
16 1.16.2.2 rmind #include <cstdint>
17 1.16.2.2 rmind
18 1.16.2.2 rmind namespace _Unwind {
19 1.16.2.2 rmind
20 1.16.2.2 rmind enum {
21 1.16.2.2 rmind REGNO_X86_EAX = 0,
22 1.16.2.2 rmind REGNO_X86_ECX = 1,
23 1.16.2.2 rmind REGNO_X86_EDX = 2,
24 1.16.2.2 rmind REGNO_X86_EBX = 3,
25 1.16.2.2 rmind REGNO_X86_ESP = 4,
26 1.16.2.2 rmind REGNO_X86_EBP = 5,
27 1.16.2.2 rmind REGNO_X86_ESI = 6,
28 1.16.2.2 rmind REGNO_X86_EDI = 7,
29 1.16.2.2 rmind REGNO_X86_EIP = 8,
30 1.16.2.2 rmind };
31 1.16.2.2 rmind
32 1.16.2.2 rmind class Registers_x86 {
33 1.16.2.2 rmind public:
34 1.16.2.2 rmind enum {
35 1.16.2.2 rmind LAST_REGISTER = REGNO_X86_EIP,
36 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_X86_EIP,
37 1.16.2.2 rmind RETURN_OFFSET = 0,
38 1.16.2.2 rmind };
39 1.16.2.2 rmind
40 1.16.2.2 rmind __dso_hidden Registers_x86();
41 1.16.2.2 rmind
42 1.16.2.2 rmind static int dwarf2regno(int num) { return num; }
43 1.16.2.2 rmind
44 1.16.2.2 rmind bool validRegister(int num) const {
45 1.16.2.2 rmind return num >= REGNO_X86_EAX && num <= REGNO_X86_EDI;
46 1.16.2.2 rmind }
47 1.16.2.2 rmind
48 1.16.2.2 rmind uint32_t getRegister(int num) const {
49 1.16.2.2 rmind assert(validRegister(num));
50 1.16.2.2 rmind return reg[num];
51 1.16.2.2 rmind }
52 1.16.2.2 rmind
53 1.16.2.2 rmind void setRegister(int num, uint32_t value) {
54 1.16.2.2 rmind assert(validRegister(num));
55 1.16.2.2 rmind reg[num] = value;
56 1.16.2.2 rmind }
57 1.16.2.2 rmind
58 1.16.2.2 rmind uint32_t getIP() const { return reg[REGNO_X86_EIP]; }
59 1.16.2.2 rmind
60 1.16.2.2 rmind void setIP(uint32_t value) { reg[REGNO_X86_EIP] = value; }
61 1.16.2.2 rmind
62 1.16.2.2 rmind uint32_t getSP() const { return reg[REGNO_X86_ESP]; }
63 1.16.2.2 rmind
64 1.16.2.2 rmind void setSP(uint32_t value) { reg[REGNO_X86_ESP] = value; }
65 1.16.2.2 rmind
66 1.16.2.2 rmind bool validFloatVectorRegister(int num) const { return false; }
67 1.16.2.2 rmind
68 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint32_t addr) {
69 1.16.2.2 rmind }
70 1.16.2.2 rmind
71 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
72 1.16.2.2 rmind
73 1.16.2.2 rmind private:
74 1.16.2.2 rmind uint32_t reg[REGNO_X86_EIP + 1];
75 1.16.2.2 rmind };
76 1.16.2.2 rmind
77 1.16.2.2 rmind enum {
78 1.16.2.2 rmind REGNO_X86_64_RAX = 0,
79 1.16.2.2 rmind REGNO_X86_64_RDX = 1,
80 1.16.2.2 rmind REGNO_X86_64_RCX = 2,
81 1.16.2.2 rmind REGNO_X86_64_RBX = 3,
82 1.16.2.2 rmind REGNO_X86_64_RSI = 4,
83 1.16.2.2 rmind REGNO_X86_64_RDI = 5,
84 1.16.2.2 rmind REGNO_X86_64_RBP = 6,
85 1.16.2.2 rmind REGNO_X86_64_RSP = 7,
86 1.16.2.2 rmind REGNO_X86_64_R8 = 8,
87 1.16.2.2 rmind REGNO_X86_64_R9 = 9,
88 1.16.2.2 rmind REGNO_X86_64_R10 = 10,
89 1.16.2.2 rmind REGNO_X86_64_R11 = 11,
90 1.16.2.2 rmind REGNO_X86_64_R12 = 12,
91 1.16.2.2 rmind REGNO_X86_64_R13 = 13,
92 1.16.2.2 rmind REGNO_X86_64_R14 = 14,
93 1.16.2.2 rmind REGNO_X86_64_R15 = 15,
94 1.16.2.2 rmind REGNO_X86_64_RIP = 16,
95 1.16.2.2 rmind };
96 1.16.2.2 rmind
97 1.16.2.2 rmind class Registers_x86_64 {
98 1.16.2.2 rmind public:
99 1.16.2.2 rmind enum {
100 1.16.2.2 rmind LAST_REGISTER = REGNO_X86_64_RIP,
101 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_X86_64_RIP,
102 1.16.2.2 rmind RETURN_OFFSET = 0,
103 1.16.2.2 rmind };
104 1.16.2.2 rmind
105 1.16.2.2 rmind __dso_hidden Registers_x86_64();
106 1.16.2.2 rmind
107 1.16.2.2 rmind static int dwarf2regno(int num) { return num; }
108 1.16.2.2 rmind
109 1.16.2.2 rmind bool validRegister(int num) const {
110 1.16.2.2 rmind return num >= REGNO_X86_64_RAX && num <= REGNO_X86_64_R15;
111 1.16.2.2 rmind }
112 1.16.2.2 rmind
113 1.16.2.2 rmind uint64_t getRegister(int num) const {
114 1.16.2.2 rmind assert(validRegister(num));
115 1.16.2.2 rmind return reg[num];
116 1.16.2.2 rmind }
117 1.16.2.2 rmind
118 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
119 1.16.2.2 rmind assert(validRegister(num));
120 1.16.2.2 rmind reg[num] = value;
121 1.16.2.2 rmind }
122 1.16.2.2 rmind
123 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_X86_64_RIP]; }
124 1.16.2.2 rmind
125 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_X86_64_RIP] = value; }
126 1.16.2.2 rmind
127 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_X86_64_RSP]; }
128 1.16.2.2 rmind
129 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_X86_64_RSP] = value; }
130 1.16.2.2 rmind
131 1.16.2.2 rmind bool validFloatVectorRegister(int num) const { return false; }
132 1.16.2.2 rmind
133 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr) {
134 1.16.2.2 rmind }
135 1.16.2.2 rmind
136 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
137 1.16.2.2 rmind
138 1.16.2.2 rmind private:
139 1.16.2.2 rmind uint64_t reg[REGNO_X86_64_RIP + 1];
140 1.16.2.2 rmind };
141 1.16.2.2 rmind
142 1.16.2.2 rmind enum {
143 1.16.2.2 rmind DWARF_PPC32_R0 = 0,
144 1.16.2.2 rmind DWARF_PPC32_R31 = 31,
145 1.16.2.2 rmind DWARF_PPC32_F0 = 32,
146 1.16.2.2 rmind DWARF_PPC32_F31 = 63,
147 1.16.2.2 rmind DWARF_PPC32_LR = 65,
148 1.16.2.2 rmind DWARF_PPC32_CR = 70,
149 1.16.2.2 rmind DWARF_PPC32_V0 = 77,
150 1.16.2.2 rmind DWARF_PPC32_V31 = 108,
151 1.16.2.2 rmind
152 1.16.2.2 rmind REGNO_PPC32_R0 = 0,
153 1.16.2.2 rmind REGNO_PPC32_R1 = 1,
154 1.16.2.2 rmind REGNO_PPC32_R31 = 31,
155 1.16.2.2 rmind REGNO_PPC32_LR = 32,
156 1.16.2.2 rmind REGNO_PPC32_CR = 33,
157 1.16.2.2 rmind REGNO_PPC32_SRR0 = 34,
158 1.16.2.2 rmind
159 1.16.2.2 rmind REGNO_PPC32_F0 = REGNO_PPC32_SRR0 + 1,
160 1.16.2.2 rmind REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31,
161 1.16.2.2 rmind REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1,
162 1.16.2.2 rmind REGNO_PPC32_V31 = REGNO_PPC32_V0 + 31,
163 1.16.2.2 rmind };
164 1.16.2.2 rmind
165 1.16.2.2 rmind class Registers_ppc32 {
166 1.16.2.2 rmind public:
167 1.16.2.2 rmind enum {
168 1.16.2.2 rmind LAST_REGISTER = REGNO_PPC32_V31,
169 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_PPC32_V31,
170 1.16.2.2 rmind RETURN_OFFSET = 0,
171 1.16.2.2 rmind };
172 1.16.2.2 rmind
173 1.16.2.2 rmind __dso_hidden Registers_ppc32();
174 1.16.2.2 rmind
175 1.16.2.2 rmind static int dwarf2regno(int num) {
176 1.16.2.2 rmind if (num >= DWARF_PPC32_R0 && num <= DWARF_PPC32_R31)
177 1.16.2.2 rmind return REGNO_PPC32_R0 + (num - DWARF_PPC32_R0);
178 1.16.2.2 rmind if (num >= DWARF_PPC32_F0 && num <= DWARF_PPC32_F31)
179 1.16.2.2 rmind return REGNO_PPC32_F0 + (num - DWARF_PPC32_F0);
180 1.16.2.2 rmind if (num >= DWARF_PPC32_V0 && num <= DWARF_PPC32_V31)
181 1.16.2.2 rmind return REGNO_PPC32_V0 + (num - DWARF_PPC32_V0);
182 1.16.2.2 rmind switch (num) {
183 1.16.2.2 rmind case DWARF_PPC32_LR:
184 1.16.2.2 rmind return REGNO_PPC32_LR;
185 1.16.2.2 rmind case DWARF_PPC32_CR:
186 1.16.2.2 rmind return REGNO_PPC32_CR;
187 1.16.2.2 rmind default:
188 1.16.2.2 rmind return LAST_REGISTER + 1;
189 1.16.2.2 rmind }
190 1.16.2.2 rmind }
191 1.16.2.2 rmind
192 1.16.2.2 rmind bool validRegister(int num) const {
193 1.16.2.2 rmind return num >= 0 && num <= LAST_RESTORE_REG;
194 1.16.2.2 rmind }
195 1.16.2.2 rmind
196 1.16.2.2 rmind uint64_t getRegister(int num) const {
197 1.16.2.2 rmind assert(validRegister(num));
198 1.16.2.2 rmind return reg[num];
199 1.16.2.2 rmind }
200 1.16.2.2 rmind
201 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
202 1.16.2.2 rmind assert(validRegister(num));
203 1.16.2.2 rmind reg[num] = value;
204 1.16.2.2 rmind }
205 1.16.2.2 rmind
206 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_PPC32_SRR0]; }
207 1.16.2.2 rmind
208 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_PPC32_SRR0] = value; }
209 1.16.2.2 rmind
210 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_PPC32_R1]; }
211 1.16.2.2 rmind
212 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_PPC32_R1] = value; }
213 1.16.2.2 rmind
214 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
215 1.16.2.2 rmind return (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31) ||
216 1.16.2.2 rmind (num >= REGNO_PPC32_V0 && num <= REGNO_PPC32_V31);
217 1.16.2.2 rmind }
218 1.16.2.2 rmind
219 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
220 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
221 1.16.2.2 rmind if (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31)
222 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_PPC32_F0), addr, sizeof(fpreg[0]));
223 1.16.2.2 rmind else
224 1.16.2.2 rmind memcpy(vecreg + (num - REGNO_PPC32_V0), addr, sizeof(vecreg[0]));
225 1.16.2.2 rmind }
226 1.16.2.2 rmind
227 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
228 1.16.2.2 rmind
229 1.16.2.2 rmind private:
230 1.16.2.2 rmind struct vecreg_t {
231 1.16.2.2 rmind uint64_t low, high;
232 1.16.2.2 rmind };
233 1.16.2.2 rmind uint32_t reg[REGNO_PPC32_SRR0 + 1];
234 1.16.2.2 rmind uint32_t dummy;
235 1.16.2.2 rmind uint64_t fpreg[32];
236 1.16.2.2 rmind vecreg_t vecreg[64];
237 1.16.2.2 rmind };
238 1.16.2.2 rmind
239 1.16.2.2 rmind enum {
240 1.16.2.2 rmind DWARF_ARM32_R0 = 0,
241 1.16.2.2 rmind DWARF_ARM32_R15 = 15,
242 1.16.2.2 rmind DWARF_ARM32_SPSR = 128,
243 1.16.2.2 rmind DWARF_ARM32_OLD_S0 = 64,
244 1.16.2.2 rmind DWARF_ARM32_OLD_S31 = 91,
245 1.16.2.2 rmind DWARF_ARM32_D0 = 256,
246 1.16.2.2 rmind DWARF_ARM32_D31 = 287,
247 1.16.2.2 rmind REGNO_ARM32_R0 = 0,
248 1.16.2.2 rmind REGNO_ARM32_SP = 13,
249 1.16.2.2 rmind REGNO_ARM32_R15 = 15,
250 1.16.2.2 rmind REGNO_ARM32_SPSR = 16,
251 1.16.2.2 rmind REGNO_ARM32_D0 = 17,
252 1.16.2.2 rmind REGNO_ARM32_D15 = 32,
253 1.16.2.2 rmind REGNO_ARM32_D31 = 48,
254 1.16.2.2 rmind };
255 1.16.2.2 rmind
256 1.16.2.2 rmind class Registers_arm32 {
257 1.16.2.2 rmind public:
258 1.16.2.2 rmind enum {
259 1.16.2.2 rmind LAST_REGISTER = REGNO_ARM32_D31,
260 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_ARM32_D31,
261 1.16.2.2 rmind RETURN_OFFSET = 0,
262 1.16.2.2 rmind };
263 1.16.2.2 rmind
264 1.16.2.2 rmind __dso_hidden Registers_arm32();
265 1.16.2.2 rmind
266 1.16.2.2 rmind static int dwarf2regno(int num) {
267 1.16.2.2 rmind if (num >= DWARF_ARM32_R0 && num <= DWARF_ARM32_R15)
268 1.16.2.2 rmind return REGNO_ARM32_R0 + (num - DWARF_ARM32_R0);
269 1.16.2.2 rmind if (num == DWARF_ARM32_SPSR)
270 1.16.2.2 rmind return REGNO_ARM32_SPSR;
271 1.16.2.2 rmind if (num >= DWARF_ARM32_D0 && num <= DWARF_ARM32_D31)
272 1.16.2.2 rmind return REGNO_ARM32_D0 + (num - DWARF_ARM32_D0);
273 1.16.2.2 rmind if (num >= DWARF_ARM32_OLD_S0 && num <= DWARF_ARM32_OLD_S31) {
274 1.16.2.2 rmind assert(num % 2 == 0);
275 1.16.2.2 rmind return REGNO_ARM32_D0 + (num - DWARF_ARM32_OLD_S0) / 2;
276 1.16.2.2 rmind }
277 1.16.2.2 rmind return LAST_REGISTER + 1;
278 1.16.2.2 rmind }
279 1.16.2.2 rmind
280 1.16.2.2 rmind bool validRegister(int num) const {
281 1.16.2.2 rmind return num >= 0 && num <= REGNO_ARM32_SPSR;
282 1.16.2.2 rmind }
283 1.16.2.2 rmind
284 1.16.2.2 rmind uint64_t getRegister(int num) const {
285 1.16.2.2 rmind assert(validRegister(num));
286 1.16.2.2 rmind return reg[num];
287 1.16.2.2 rmind }
288 1.16.2.2 rmind
289 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
290 1.16.2.2 rmind assert(validRegister(num));
291 1.16.2.2 rmind reg[num] = value;
292 1.16.2.2 rmind }
293 1.16.2.2 rmind
294 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_ARM32_R15]; }
295 1.16.2.2 rmind
296 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_ARM32_R15] = value; }
297 1.16.2.2 rmind
298 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_ARM32_SP]; }
299 1.16.2.2 rmind
300 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_ARM32_SP] = value; }
301 1.16.2.2 rmind
302 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
303 1.16.2.2 rmind return (num >= REGNO_ARM32_D0 && num <= REGNO_ARM32_D31);
304 1.16.2.2 rmind }
305 1.16.2.2 rmind
306 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
307 1.16.2.2 rmind if (num <= REGNO_ARM32_D15) {
308 1.16.2.2 rmind if ((flags & 1) == 0) {
309 1.16.2.2 rmind lazyVFP1();
310 1.16.2.2 rmind flags |= 1;
311 1.16.2.2 rmind }
312 1.16.2.2 rmind } else {
313 1.16.2.2 rmind if ((flags & 2) == 0) {
314 1.16.2.2 rmind lazyVFP3();
315 1.16.2.2 rmind flags |= 2;
316 1.16.2.2 rmind }
317 1.16.2.2 rmind }
318 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
319 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_ARM32_D0), addr, sizeof(fpreg[0]));
320 1.16.2.2 rmind }
321 1.16.2.2 rmind
322 1.16.2.2 rmind __dso_hidden void lazyVFP1();
323 1.16.2.2 rmind __dso_hidden void lazyVFP3();
324 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
325 1.16.2.2 rmind
326 1.16.2.2 rmind private:
327 1.16.2.2 rmind uint32_t reg[REGNO_ARM32_SPSR + 1];
328 1.16.2.2 rmind uint32_t flags;
329 1.16.2.2 rmind uint64_t fpreg[32];
330 1.16.2.2 rmind };
331 1.16.2.2 rmind
332 1.16.2.2 rmind enum {
333 1.16.2.2 rmind DWARF_VAX_R0 = 0,
334 1.16.2.2 rmind DWARF_VAX_R15 = 15,
335 1.16.2.2 rmind DWARF_VAX_PSW = 16,
336 1.16.2.2 rmind
337 1.16.2.2 rmind REGNO_VAX_R0 = 0,
338 1.16.2.2 rmind REGNO_VAX_R14 = 14,
339 1.16.2.2 rmind REGNO_VAX_R15 = 15,
340 1.16.2.2 rmind REGNO_VAX_PSW = 16,
341 1.16.2.2 rmind };
342 1.16.2.2 rmind
343 1.16.2.2 rmind class Registers_vax {
344 1.16.2.2 rmind public:
345 1.16.2.2 rmind enum {
346 1.16.2.2 rmind LAST_REGISTER = REGNO_VAX_PSW,
347 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_VAX_PSW,
348 1.16.2.2 rmind RETURN_OFFSET = 0,
349 1.16.2.2 rmind };
350 1.16.2.2 rmind
351 1.16.2.2 rmind __dso_hidden Registers_vax();
352 1.16.2.2 rmind
353 1.16.2.2 rmind static int dwarf2regno(int num) {
354 1.16.2.2 rmind if (num >= DWARF_VAX_R0 && num <= DWARF_VAX_R15)
355 1.16.2.2 rmind return REGNO_VAX_R0 + (num - DWARF_VAX_R0);
356 1.16.2.2 rmind if (num == DWARF_VAX_PSW)
357 1.16.2.2 rmind return REGNO_VAX_PSW;
358 1.16.2.2 rmind return LAST_REGISTER + 1;
359 1.16.2.2 rmind }
360 1.16.2.2 rmind
361 1.16.2.2 rmind bool validRegister(int num) const {
362 1.16.2.2 rmind return num >= 0 && num <= LAST_RESTORE_REG;
363 1.16.2.2 rmind }
364 1.16.2.2 rmind
365 1.16.2.2 rmind uint64_t getRegister(int num) const {
366 1.16.2.2 rmind assert(validRegister(num));
367 1.16.2.2 rmind return reg[num];
368 1.16.2.2 rmind }
369 1.16.2.2 rmind
370 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
371 1.16.2.2 rmind assert(validRegister(num));
372 1.16.2.2 rmind reg[num] = value;
373 1.16.2.2 rmind }
374 1.16.2.2 rmind
375 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_VAX_R15]; }
376 1.16.2.2 rmind
377 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_VAX_R15] = value; }
378 1.16.2.2 rmind
379 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_VAX_R14]; }
380 1.16.2.2 rmind
381 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_VAX_R14] = value; }
382 1.16.2.2 rmind
383 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
384 1.16.2.2 rmind return false;
385 1.16.2.2 rmind }
386 1.16.2.2 rmind
387 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
388 1.16.2.2 rmind }
389 1.16.2.2 rmind
390 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
391 1.16.2.2 rmind
392 1.16.2.2 rmind private:
393 1.16.2.2 rmind uint32_t reg[REGNO_VAX_PSW + 1];
394 1.16.2.2 rmind };
395 1.16.2.2 rmind
396 1.16.2.2 rmind enum {
397 1.16.2.2 rmind DWARF_M68K_A0 = 0,
398 1.16.2.2 rmind DWARF_M68K_A7 = 7,
399 1.16.2.2 rmind DWARF_M68K_D0 = 8,
400 1.16.2.2 rmind DWARF_M68K_D7 = 15,
401 1.16.2.2 rmind DWARF_M68K_FP0 = 16,
402 1.16.2.2 rmind DWARF_M68K_FP7 = 23,
403 1.16.2.2 rmind DWARF_M68K_PC = 24,
404 1.16.2.2 rmind
405 1.16.2.2 rmind REGNO_M68K_A0 = 0,
406 1.16.2.2 rmind REGNO_M68K_A7 = 7,
407 1.16.2.2 rmind REGNO_M68K_D0 = 8,
408 1.16.2.2 rmind REGNO_M68K_D7 = 15,
409 1.16.2.2 rmind REGNO_M68K_PC = 16,
410 1.16.2.2 rmind REGNO_M68K_FP0 = 17,
411 1.16.2.2 rmind REGNO_M68K_FP7 = 24,
412 1.16.2.2 rmind };
413 1.16.2.2 rmind
414 1.16.2.2 rmind class Registers_M68K {
415 1.16.2.2 rmind public:
416 1.16.2.2 rmind enum {
417 1.16.2.2 rmind LAST_REGISTER = REGNO_M68K_FP7,
418 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_M68K_FP7,
419 1.16.2.2 rmind RETURN_OFFSET = 0,
420 1.16.2.2 rmind };
421 1.16.2.2 rmind
422 1.16.2.2 rmind __dso_hidden Registers_M68K();
423 1.16.2.2 rmind
424 1.16.2.2 rmind static int dwarf2regno(int num) {
425 1.16.2.2 rmind if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7)
426 1.16.2.2 rmind return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
427 1.16.2.2 rmind if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
428 1.16.2.2 rmind return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
429 1.16.2.2 rmind if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7)
430 1.16.2.2 rmind return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0);
431 1.16.2.2 rmind if (num == DWARF_M68K_PC)
432 1.16.2.2 rmind return REGNO_M68K_PC;
433 1.16.2.2 rmind return LAST_REGISTER + 1;
434 1.16.2.2 rmind }
435 1.16.2.2 rmind
436 1.16.2.2 rmind bool validRegister(int num) const {
437 1.16.2.2 rmind return num >= 0 && num <= REGNO_M68K_PC;
438 1.16.2.2 rmind }
439 1.16.2.2 rmind
440 1.16.2.2 rmind uint64_t getRegister(int num) const {
441 1.16.2.2 rmind assert(validRegister(num));
442 1.16.2.2 rmind return reg[num];
443 1.16.2.2 rmind }
444 1.16.2.2 rmind
445 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
446 1.16.2.2 rmind assert(validRegister(num));
447 1.16.2.2 rmind reg[num] = value;
448 1.16.2.2 rmind }
449 1.16.2.2 rmind
450 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_M68K_PC]; }
451 1.16.2.2 rmind
452 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; }
453 1.16.2.2 rmind
454 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_M68K_A7]; }
455 1.16.2.2 rmind
456 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; }
457 1.16.2.2 rmind
458 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
459 1.16.2.2 rmind return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7;
460 1.16.2.2 rmind }
461 1.16.2.2 rmind
462 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
463 1.16.2.2 rmind assert(validFloatVectorRegister(num));
464 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
465 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0]));
466 1.16.2.2 rmind }
467 1.16.2.2 rmind
468 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
469 1.16.2.2 rmind
470 1.16.2.2 rmind private:
471 1.16.2.2 rmind typedef uint32_t fpreg_t[3];
472 1.16.2.2 rmind
473 1.16.2.2 rmind uint32_t reg[REGNO_M68K_PC + 1];
474 1.16.2.2 rmind uint32_t dummy;
475 1.16.2.2 rmind fpreg_t fpreg[8];
476 1.16.2.2 rmind };
477 1.16.2.2 rmind
478 1.16.2.2 rmind enum {
479 1.16.2.2 rmind DWARF_SH3_R0 = 0,
480 1.16.2.2 rmind DWARF_SH3_R15 = 15,
481 1.16.2.2 rmind DWARF_SH3_PC = 16,
482 1.16.2.2 rmind DWARF_SH3_PR = 17,
483 1.16.2.2 rmind
484 1.16.2.2 rmind REGNO_SH3_R0 = 0,
485 1.16.2.2 rmind REGNO_SH3_R15 = 15,
486 1.16.2.2 rmind REGNO_SH3_PC = 16,
487 1.16.2.2 rmind REGNO_SH3_PR = 17,
488 1.16.2.2 rmind };
489 1.16.2.2 rmind
490 1.16.2.2 rmind class Registers_SH3 {
491 1.16.2.2 rmind public:
492 1.16.2.2 rmind enum {
493 1.16.2.2 rmind LAST_REGISTER = REGNO_SH3_PR,
494 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_SH3_PR,
495 1.16.2.2 rmind RETURN_OFFSET = 0,
496 1.16.2.2 rmind };
497 1.16.2.2 rmind
498 1.16.2.2 rmind __dso_hidden Registers_SH3();
499 1.16.2.2 rmind
500 1.16.2.2 rmind static int dwarf2regno(int num) {
501 1.16.2.2 rmind if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
502 1.16.2.2 rmind return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
503 1.16.2.2 rmind if (num == DWARF_SH3_PC)
504 1.16.2.2 rmind return REGNO_SH3_PC;
505 1.16.2.2 rmind if (num == DWARF_SH3_PR)
506 1.16.2.2 rmind return REGNO_SH3_PR;
507 1.16.2.2 rmind return LAST_REGISTER + 1;
508 1.16.2.2 rmind }
509 1.16.2.2 rmind
510 1.16.2.2 rmind bool validRegister(int num) const {
511 1.16.2.2 rmind return num >= 0 && num <= REGNO_SH3_PR;
512 1.16.2.2 rmind }
513 1.16.2.2 rmind
514 1.16.2.2 rmind uint64_t getRegister(int num) const {
515 1.16.2.2 rmind assert(validRegister(num));
516 1.16.2.2 rmind return reg[num];
517 1.16.2.2 rmind }
518 1.16.2.2 rmind
519 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
520 1.16.2.2 rmind assert(validRegister(num));
521 1.16.2.2 rmind reg[num] = value;
522 1.16.2.2 rmind }
523 1.16.2.2 rmind
524 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
525 1.16.2.2 rmind
526 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
527 1.16.2.2 rmind
528 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
529 1.16.2.2 rmind
530 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
531 1.16.2.2 rmind
532 1.16.2.2 rmind bool validFloatVectorRegister(int num) const { return false; }
533 1.16.2.2 rmind
534 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {}
535 1.16.2.2 rmind
536 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
537 1.16.2.2 rmind
538 1.16.2.2 rmind private:
539 1.16.2.2 rmind uint32_t reg[REGNO_SH3_PR + 1];
540 1.16.2.2 rmind };
541 1.16.2.2 rmind
542 1.16.2.2 rmind enum {
543 1.16.2.2 rmind DWARF_SPARC64_R0 = 0,
544 1.16.2.2 rmind DWARF_SPARC64_R31 = 31,
545 1.16.2.2 rmind DWARF_SPARC64_PC = 32,
546 1.16.2.2 rmind
547 1.16.2.2 rmind REGNO_SPARC64_R0 = 0,
548 1.16.2.2 rmind REGNO_SPARC64_R14 = 14,
549 1.16.2.2 rmind REGNO_SPARC64_R15 = 15,
550 1.16.2.2 rmind REGNO_SPARC64_R31 = 31,
551 1.16.2.2 rmind REGNO_SPARC64_PC = 32,
552 1.16.2.2 rmind };
553 1.16.2.2 rmind
554 1.16.2.2 rmind class Registers_SPARC64 {
555 1.16.2.2 rmind public:
556 1.16.2.2 rmind enum {
557 1.16.2.2 rmind LAST_REGISTER = REGNO_SPARC64_PC,
558 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_SPARC64_PC,
559 1.16.2.2 rmind RETURN_OFFSET = 8,
560 1.16.2.2 rmind };
561 1.16.2.2 rmind typedef uint64_t reg_t;
562 1.16.2.2 rmind
563 1.16.2.2 rmind __dso_hidden Registers_SPARC64();
564 1.16.2.2 rmind
565 1.16.2.2 rmind static int dwarf2regno(int num) {
566 1.16.2.2 rmind if (num >= DWARF_SPARC64_R0 && num <= DWARF_SPARC64_R31)
567 1.16.2.2 rmind return REGNO_SPARC64_R0 + (num - DWARF_SPARC64_R0);
568 1.16.2.2 rmind if (num == DWARF_SPARC64_PC)
569 1.16.2.2 rmind return REGNO_SPARC64_PC;
570 1.16.2.2 rmind return LAST_REGISTER + 1;
571 1.16.2.2 rmind }
572 1.16.2.2 rmind
573 1.16.2.2 rmind bool validRegister(int num) const {
574 1.16.2.2 rmind return num >= 0 && num <= REGNO_SPARC64_PC;
575 1.16.2.2 rmind }
576 1.16.2.2 rmind
577 1.16.2.2 rmind uint64_t getRegister(int num) const {
578 1.16.2.2 rmind assert(validRegister(num));
579 1.16.2.2 rmind return reg[num];
580 1.16.2.2 rmind }
581 1.16.2.2 rmind
582 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
583 1.16.2.2 rmind assert(validRegister(num));
584 1.16.2.2 rmind reg[num] = value;
585 1.16.2.2 rmind }
586 1.16.2.2 rmind
587 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_SPARC64_PC]; }
588 1.16.2.2 rmind
589 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_SPARC64_PC] = value; }
590 1.16.2.2 rmind
591 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_SPARC64_R14]; }
592 1.16.2.2 rmind
593 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_SPARC64_R14] = value; }
594 1.16.2.2 rmind
595 1.16.2.2 rmind bool validFloatVectorRegister(int num) const { return false; }
596 1.16.2.2 rmind
597 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {}
598 1.16.2.2 rmind
599 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
600 1.16.2.2 rmind
601 1.16.2.2 rmind private:
602 1.16.2.2 rmind uint64_t reg[REGNO_SPARC64_PC + 1];
603 1.16.2.2 rmind };
604 1.16.2.2 rmind
605 1.16.2.2 rmind enum {
606 1.16.2.2 rmind DWARF_SPARC_R0 = 0,
607 1.16.2.2 rmind DWARF_SPARC_R31 = 31,
608 1.16.2.2 rmind DWARF_SPARC_PC = 32,
609 1.16.2.2 rmind
610 1.16.2.2 rmind REGNO_SPARC_R0 = 0,
611 1.16.2.2 rmind REGNO_SPARC_R14 = 14,
612 1.16.2.2 rmind REGNO_SPARC_R15 = 15,
613 1.16.2.2 rmind REGNO_SPARC_R31 = 31,
614 1.16.2.2 rmind REGNO_SPARC_PC = 32,
615 1.16.2.2 rmind };
616 1.16.2.2 rmind
617 1.16.2.2 rmind class Registers_SPARC {
618 1.16.2.2 rmind public:
619 1.16.2.2 rmind enum {
620 1.16.2.2 rmind LAST_REGISTER = REGNO_SPARC_PC,
621 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_SPARC_PC,
622 1.16.2.2 rmind RETURN_OFFSET = 8,
623 1.16.2.2 rmind };
624 1.16.2.2 rmind typedef uint32_t reg_t;
625 1.16.2.2 rmind
626 1.16.2.2 rmind __dso_hidden Registers_SPARC();
627 1.16.2.2 rmind
628 1.16.2.2 rmind static int dwarf2regno(int num) {
629 1.16.2.2 rmind if (num >= DWARF_SPARC_R0 && num <= DWARF_SPARC_R31)
630 1.16.2.2 rmind return REGNO_SPARC_R0 + (num - DWARF_SPARC_R0);
631 1.16.2.2 rmind if (num == DWARF_SPARC_PC)
632 1.16.2.2 rmind return REGNO_SPARC_PC;
633 1.16.2.2 rmind return LAST_REGISTER + 1;
634 1.16.2.2 rmind }
635 1.16.2.2 rmind
636 1.16.2.2 rmind bool validRegister(int num) const {
637 1.16.2.2 rmind return num >= 0 && num <= REGNO_SPARC_PC;
638 1.16.2.2 rmind }
639 1.16.2.2 rmind
640 1.16.2.2 rmind uint64_t getRegister(int num) const {
641 1.16.2.2 rmind assert(validRegister(num));
642 1.16.2.2 rmind return reg[num];
643 1.16.2.2 rmind }
644 1.16.2.2 rmind
645 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
646 1.16.2.2 rmind assert(validRegister(num));
647 1.16.2.2 rmind reg[num] = value;
648 1.16.2.2 rmind }
649 1.16.2.2 rmind
650 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_SPARC_PC]; }
651 1.16.2.2 rmind
652 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_SPARC_PC] = value; }
653 1.16.2.2 rmind
654 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_SPARC_R14]; }
655 1.16.2.2 rmind
656 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_SPARC_R14] = value; }
657 1.16.2.2 rmind
658 1.16.2.2 rmind bool validFloatVectorRegister(int num) const { return false; }
659 1.16.2.2 rmind
660 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {}
661 1.16.2.2 rmind
662 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
663 1.16.2.2 rmind
664 1.16.2.2 rmind private:
665 1.16.2.2 rmind uint32_t reg[REGNO_SPARC_PC + 1];
666 1.16.2.2 rmind };
667 1.16.2.2 rmind
668 1.16.2.2 rmind enum {
669 1.16.2.2 rmind DWARF_ALPHA_R0 = 0,
670 1.16.2.2 rmind DWARF_ALPHA_R30 = 30,
671 1.16.2.2 rmind DWARF_ALPHA_F0 = 32,
672 1.16.2.2 rmind DWARF_ALPHA_F30 = 62,
673 1.16.2.2 rmind
674 1.16.2.2 rmind REGNO_ALPHA_R0 = 0,
675 1.16.2.2 rmind REGNO_ALPHA_R26 = 26,
676 1.16.2.2 rmind REGNO_ALPHA_R30 = 30,
677 1.16.2.2 rmind REGNO_ALPHA_PC = 31,
678 1.16.2.2 rmind REGNO_ALPHA_F0 = 32,
679 1.16.2.2 rmind REGNO_ALPHA_F30 = 62,
680 1.16.2.2 rmind };
681 1.16.2.2 rmind
682 1.16.2.2 rmind class Registers_Alpha {
683 1.16.2.2 rmind public:
684 1.16.2.2 rmind enum {
685 1.16.2.2 rmind LAST_REGISTER = REGNO_ALPHA_F30,
686 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_ALPHA_F30,
687 1.16.2.2 rmind RETURN_OFFSET = 0,
688 1.16.2.2 rmind };
689 1.16.2.2 rmind typedef uint32_t reg_t;
690 1.16.2.2 rmind
691 1.16.2.2 rmind __dso_hidden Registers_Alpha();
692 1.16.2.2 rmind
693 1.16.2.2 rmind static int dwarf2regno(int num) { return num; }
694 1.16.2.2 rmind
695 1.16.2.2 rmind bool validRegister(int num) const {
696 1.16.2.2 rmind return num >= 0 && num <= REGNO_ALPHA_PC;
697 1.16.2.2 rmind }
698 1.16.2.2 rmind
699 1.16.2.2 rmind uint64_t getRegister(int num) const {
700 1.16.2.2 rmind assert(validRegister(num));
701 1.16.2.2 rmind return reg[num];
702 1.16.2.2 rmind }
703 1.16.2.2 rmind
704 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
705 1.16.2.2 rmind assert(validRegister(num));
706 1.16.2.2 rmind reg[num] = value;
707 1.16.2.2 rmind }
708 1.16.2.2 rmind
709 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_ALPHA_PC]; }
710 1.16.2.2 rmind
711 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_ALPHA_PC] = value; }
712 1.16.2.2 rmind
713 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_ALPHA_R30]; }
714 1.16.2.2 rmind
715 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_ALPHA_R30] = value; }
716 1.16.2.2 rmind
717 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
718 1.16.2.2 rmind return num >= REGNO_ALPHA_F0 && num <= REGNO_ALPHA_F30;
719 1.16.2.2 rmind }
720 1.16.2.2 rmind
721 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
722 1.16.2.2 rmind assert(validFloatVectorRegister(num));
723 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
724 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_ALPHA_F0), addr, sizeof(fpreg[0]));
725 1.16.2.2 rmind }
726 1.16.2.2 rmind
727 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
728 1.16.2.2 rmind
729 1.16.2.2 rmind private:
730 1.16.2.2 rmind uint64_t reg[REGNO_ALPHA_PC + 1];
731 1.16.2.2 rmind uint64_t fpreg[31];
732 1.16.2.2 rmind };
733 1.16.2.2 rmind
734 1.16.2.2 rmind enum {
735 1.16.2.2 rmind DWARF_HPPA_R1 = 1,
736 1.16.2.2 rmind DWARF_HPPA_R31 = 31,
737 1.16.2.2 rmind DWARF_HPPA_FR4L = 32,
738 1.16.2.2 rmind DWARF_HPPA_FR31H = 87,
739 1.16.2.2 rmind
740 1.16.2.2 rmind REGNO_HPPA_PC = 0,
741 1.16.2.2 rmind REGNO_HPPA_R1 = 1,
742 1.16.2.2 rmind REGNO_HPPA_R2 = 2,
743 1.16.2.2 rmind REGNO_HPPA_R30 = 30,
744 1.16.2.2 rmind REGNO_HPPA_R31 = 31,
745 1.16.2.2 rmind REGNO_HPPA_FR4L = 32,
746 1.16.2.2 rmind REGNO_HPPA_FR31H = 87,
747 1.16.2.2 rmind };
748 1.16.2.2 rmind
749 1.16.2.2 rmind class Registers_HPPA {
750 1.16.2.2 rmind public:
751 1.16.2.2 rmind enum {
752 1.16.2.2 rmind LAST_REGISTER = REGNO_HPPA_FR31H,
753 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_HPPA_FR31H,
754 1.16.2.2 rmind RETURN_OFFSET = -3, // strictly speaking, this is a mask
755 1.16.2.2 rmind };
756 1.16.2.2 rmind
757 1.16.2.2 rmind __dso_hidden Registers_HPPA();
758 1.16.2.2 rmind
759 1.16.2.2 rmind static int dwarf2regno(int num) {
760 1.16.2.2 rmind if (num >= DWARF_HPPA_R1 && num <= DWARF_HPPA_R31)
761 1.16.2.2 rmind return REGNO_HPPA_R1 + (num - DWARF_HPPA_R1);
762 1.16.2.2 rmind if (num >= DWARF_HPPA_FR4L && num <= DWARF_HPPA_FR31H)
763 1.16.2.2 rmind return REGNO_HPPA_FR4L + (num - DWARF_HPPA_FR31H);
764 1.16.2.2 rmind return LAST_REGISTER + 1;
765 1.16.2.2 rmind }
766 1.16.2.2 rmind
767 1.16.2.2 rmind bool validRegister(int num) const {
768 1.16.2.2 rmind return num >= REGNO_HPPA_PC && num <= REGNO_HPPA_R31;
769 1.16.2.2 rmind }
770 1.16.2.2 rmind
771 1.16.2.2 rmind uint64_t getRegister(int num) const {
772 1.16.2.2 rmind assert(validRegister(num));
773 1.16.2.2 rmind return reg[num];
774 1.16.2.2 rmind }
775 1.16.2.2 rmind
776 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
777 1.16.2.2 rmind assert(validRegister(num));
778 1.16.2.2 rmind reg[num] = value;
779 1.16.2.2 rmind }
780 1.16.2.2 rmind
781 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_HPPA_PC]; }
782 1.16.2.2 rmind
783 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_HPPA_PC] = value; }
784 1.16.2.2 rmind
785 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_HPPA_R30]; }
786 1.16.2.2 rmind
787 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_HPPA_R30] = value; }
788 1.16.2.2 rmind
789 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
790 1.16.2.2 rmind return num >= REGNO_HPPA_FR4L && num <= REGNO_HPPA_FR31H;
791 1.16.2.2 rmind }
792 1.16.2.2 rmind
793 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
794 1.16.2.2 rmind assert(validFloatVectorRegister(num));
795 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
796 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_HPPA_FR4L), addr, sizeof(fpreg[0]));
797 1.16.2.2 rmind }
798 1.16.2.2 rmind
799 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
800 1.16.2.2 rmind
801 1.16.2.2 rmind private:
802 1.16.2.2 rmind uint32_t reg[REGNO_HPPA_R31 + 1];
803 1.16.2.2 rmind uint32_t fpreg[56];
804 1.16.2.2 rmind };
805 1.16.2.2 rmind
806 1.16.2.2 rmind enum {
807 1.16.2.2 rmind DWARF_MIPS_R1 = 0,
808 1.16.2.2 rmind DWARF_MIPS_R31 = 31,
809 1.16.2.2 rmind DWARF_MIPS_F0 = 32,
810 1.16.2.2 rmind DWARF_MIPS_F31 = 63,
811 1.16.2.2 rmind
812 1.16.2.2 rmind REGNO_MIPS_PC = 0,
813 1.16.2.2 rmind REGNO_MIPS_R1 = 0,
814 1.16.2.2 rmind REGNO_MIPS_R29 = 29,
815 1.16.2.2 rmind REGNO_MIPS_R31 = 31,
816 1.16.2.2 rmind REGNO_MIPS_F0 = 33,
817 1.16.2.2 rmind REGNO_MIPS_F31 = 64
818 1.16.2.2 rmind };
819 1.16.2.2 rmind
820 1.16.2.2 rmind class Registers_MIPS {
821 1.16.2.2 rmind public:
822 1.16.2.2 rmind enum {
823 1.16.2.2 rmind LAST_REGISTER = REGNO_MIPS_F31,
824 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_MIPS_F31,
825 1.16.2.2 rmind RETURN_OFFSET = 0,
826 1.16.2.2 rmind };
827 1.16.2.2 rmind
828 1.16.2.2 rmind __dso_hidden Registers_MIPS();
829 1.16.2.2 rmind
830 1.16.2.2 rmind static int dwarf2regno(int num) {
831 1.16.2.2 rmind if (num >= DWARF_MIPS_R1 && num <= DWARF_MIPS_R31)
832 1.16.2.2 rmind return REGNO_MIPS_R1 + (num - DWARF_MIPS_R1);
833 1.16.2.2 rmind if (num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31)
834 1.16.2.2 rmind return REGNO_MIPS_F0 + (num - DWARF_MIPS_F0);
835 1.16.2.2 rmind return LAST_REGISTER + 1;
836 1.16.2.2 rmind }
837 1.16.2.2 rmind
838 1.16.2.2 rmind bool validRegister(int num) const {
839 1.16.2.2 rmind return num >= REGNO_MIPS_PC && num <= REGNO_MIPS_R31;
840 1.16.2.2 rmind }
841 1.16.2.2 rmind
842 1.16.2.2 rmind uint64_t getRegister(int num) const {
843 1.16.2.2 rmind assert(validRegister(num));
844 1.16.2.2 rmind return reg[num];
845 1.16.2.2 rmind }
846 1.16.2.2 rmind
847 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
848 1.16.2.2 rmind assert(validRegister(num));
849 1.16.2.2 rmind reg[num] = value;
850 1.16.2.2 rmind }
851 1.16.2.2 rmind
852 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_MIPS_PC]; }
853 1.16.2.2 rmind
854 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_MIPS_PC] = value; }
855 1.16.2.2 rmind
856 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_MIPS_R29]; }
857 1.16.2.2 rmind
858 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_MIPS_R29] = value; }
859 1.16.2.2 rmind
860 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
861 1.16.2.2 rmind return num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31;
862 1.16.2.2 rmind }
863 1.16.2.2 rmind
864 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
865 1.16.2.2 rmind assert(validFloatVectorRegister(num));
866 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
867 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_MIPS_F0), addr, sizeof(fpreg[0]));
868 1.16.2.2 rmind }
869 1.16.2.2 rmind
870 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
871 1.16.2.2 rmind
872 1.16.2.2 rmind private:
873 1.16.2.2 rmind uint32_t reg[REGNO_MIPS_R31 + 1];
874 1.16.2.2 rmind uint64_t fpreg[32];
875 1.16.2.2 rmind };
876 1.16.2.2 rmind
877 1.16.2.2 rmind enum {
878 1.16.2.2 rmind DWARF_MIPS64_R1 = 0,
879 1.16.2.2 rmind DWARF_MIPS64_R31 = 31,
880 1.16.2.2 rmind DWARF_MIPS64_F0 = 32,
881 1.16.2.2 rmind DWARF_MIPS64_F31 = 63,
882 1.16.2.2 rmind
883 1.16.2.2 rmind REGNO_MIPS64_PC = 0,
884 1.16.2.2 rmind REGNO_MIPS64_R1 = 0,
885 1.16.2.2 rmind REGNO_MIPS64_R29 = 29,
886 1.16.2.2 rmind REGNO_MIPS64_R31 = 31,
887 1.16.2.2 rmind REGNO_MIPS64_F0 = 33,
888 1.16.2.2 rmind REGNO_MIPS64_F31 = 64
889 1.16.2.2 rmind };
890 1.16.2.2 rmind
891 1.16.2.2 rmind class Registers_MIPS64 {
892 1.16.2.2 rmind public:
893 1.16.2.2 rmind enum {
894 1.16.2.2 rmind LAST_REGISTER = REGNO_MIPS64_F31,
895 1.16.2.2 rmind LAST_RESTORE_REG = REGNO_MIPS64_F31,
896 1.16.2.2 rmind RETURN_OFFSET = 0,
897 1.16.2.2 rmind };
898 1.16.2.2 rmind
899 1.16.2.2 rmind __dso_hidden Registers_MIPS64();
900 1.16.2.2 rmind
901 1.16.2.2 rmind static int dwarf2regno(int num) {
902 1.16.2.2 rmind if (num >= DWARF_MIPS64_R1 && num <= DWARF_MIPS64_R31)
903 1.16.2.2 rmind return REGNO_MIPS64_R1 + (num - DWARF_MIPS64_R1);
904 1.16.2.2 rmind if (num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31)
905 1.16.2.2 rmind return REGNO_MIPS64_F0 + (num - DWARF_MIPS64_F0);
906 1.16.2.2 rmind return LAST_REGISTER + 1;
907 1.16.2.2 rmind }
908 1.16.2.2 rmind
909 1.16.2.2 rmind bool validRegister(int num) const {
910 1.16.2.2 rmind return num >= REGNO_MIPS64_PC && num <= REGNO_MIPS64_R31;
911 1.16.2.2 rmind }
912 1.16.2.2 rmind
913 1.16.2.2 rmind uint64_t getRegister(int num) const {
914 1.16.2.2 rmind assert(validRegister(num));
915 1.16.2.2 rmind return reg[num];
916 1.16.2.2 rmind }
917 1.16.2.2 rmind
918 1.16.2.2 rmind void setRegister(int num, uint64_t value) {
919 1.16.2.2 rmind assert(validRegister(num));
920 1.16.2.2 rmind reg[num] = value;
921 1.16.2.2 rmind }
922 1.16.2.2 rmind
923 1.16.2.2 rmind uint64_t getIP() const { return reg[REGNO_MIPS64_PC]; }
924 1.16.2.2 rmind
925 1.16.2.2 rmind void setIP(uint64_t value) { reg[REGNO_MIPS64_PC] = value; }
926 1.16.2.2 rmind
927 1.16.2.2 rmind uint64_t getSP() const { return reg[REGNO_MIPS64_R29]; }
928 1.16.2.2 rmind
929 1.16.2.2 rmind void setSP(uint64_t value) { reg[REGNO_MIPS64_R29] = value; }
930 1.16.2.2 rmind
931 1.16.2.2 rmind bool validFloatVectorRegister(int num) const {
932 1.16.2.2 rmind return num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31;
933 1.16.2.2 rmind }
934 1.16.2.2 rmind
935 1.16.2.2 rmind void copyFloatVectorRegister(int num, uint64_t addr_) {
936 1.16.2.2 rmind assert(validFloatVectorRegister(num));
937 1.16.2.2 rmind const void *addr = reinterpret_cast<const void *>(addr_);
938 1.16.2.2 rmind memcpy(fpreg + (num - REGNO_MIPS64_F0), addr, sizeof(fpreg[0]));
939 1.16.2.2 rmind }
940 1.16.2.2 rmind
941 1.16.2.2 rmind __dso_hidden void jumpto() const __dead;
942 1.16.2.2 rmind
943 1.16.2.2 rmind private:
944 1.16.2.2 rmind uint64_t reg[REGNO_MIPS64_R31 + 1];
945 1.16.2.2 rmind uint64_t fpreg[32];
946 1.16.2.2 rmind };
947 1.16.2.2 rmind
948 1.16.2.2 rmind #if __i386__
949 1.16.2.2 rmind typedef Registers_x86 NativeUnwindRegisters;
950 1.16.2.2 rmind #elif __x86_64__
951 1.16.2.2 rmind typedef Registers_x86_64 NativeUnwindRegisters;
952 1.16.2.2 rmind #elif __powerpc__
953 1.16.2.2 rmind typedef Registers_ppc32 NativeUnwindRegisters;
954 1.16.2.2 rmind #elif __arm__
955 1.16.2.2 rmind typedef Registers_arm32 NativeUnwindRegisters;
956 1.16.2.2 rmind #elif __vax__
957 1.16.2.2 rmind typedef Registers_vax NativeUnwindRegisters;
958 1.16.2.2 rmind #elif __m68k__
959 1.16.2.2 rmind typedef Registers_M68K NativeUnwindRegisters;
960 1.16.2.2 rmind #elif __mips_n64 || __mips_n32
961 1.16.2.2 rmind typedef Registers_MIPS64 NativeUnwindRegisters;
962 1.16.2.2 rmind #elif __mips__
963 1.16.2.2 rmind typedef Registers_MIPS NativeUnwindRegisters;
964 1.16.2.2 rmind #elif __sh3__
965 1.16.2.2 rmind typedef Registers_SH3 NativeUnwindRegisters;
966 1.16.2.2 rmind #elif __sparc64__
967 1.16.2.2 rmind typedef Registers_SPARC64 NativeUnwindRegisters;
968 1.16.2.2 rmind #elif __sparc__
969 1.16.2.2 rmind typedef Registers_SPARC NativeUnwindRegisters;
970 1.16.2.2 rmind #elif __alpha__
971 1.16.2.2 rmind typedef Registers_Alpha NativeUnwindRegisters;
972 1.16.2.2 rmind #elif __hppa__
973 1.16.2.2 rmind typedef Registers_HPPA NativeUnwindRegisters;
974 1.16.2.2 rmind #endif
975 1.16.2.2 rmind } // namespace _Unwind
976 1.16.2.2 rmind
977 1.16.2.2 rmind #endif // __REGISTERS_HPP__
978