xref: /minix3/sys/lib/libunwind/Registers.hpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1472758f3SLionel Sambuc //===----------------------------- Registers.hpp --------------------------===//
2472758f3SLionel Sambuc //
3472758f3SLionel Sambuc //                     The LLVM Compiler Infrastructure
4472758f3SLionel Sambuc //
5472758f3SLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open
6472758f3SLionel Sambuc // Source Licenses. See LICENSE.TXT for details.
7472758f3SLionel Sambuc //
8472758f3SLionel Sambuc //
9472758f3SLionel Sambuc //  Models register sets for supported processors.
10472758f3SLionel Sambuc //
11472758f3SLionel Sambuc //===----------------------------------------------------------------------===//
12472758f3SLionel Sambuc #ifndef __REGISTERS_HPP__
13472758f3SLionel Sambuc #define __REGISTERS_HPP__
14472758f3SLionel Sambuc 
15472758f3SLionel Sambuc #include <cassert>
16472758f3SLionel Sambuc #include <cstdint>
17472758f3SLionel Sambuc 
18472758f3SLionel Sambuc namespace _Unwind {
19472758f3SLionel Sambuc 
20472758f3SLionel Sambuc enum {
21472758f3SLionel Sambuc   REGNO_X86_EAX = 0,
22472758f3SLionel Sambuc   REGNO_X86_ECX = 1,
23472758f3SLionel Sambuc   REGNO_X86_EDX = 2,
24472758f3SLionel Sambuc   REGNO_X86_EBX = 3,
25472758f3SLionel Sambuc   REGNO_X86_ESP = 4,
26472758f3SLionel Sambuc   REGNO_X86_EBP = 5,
27472758f3SLionel Sambuc   REGNO_X86_ESI = 6,
28472758f3SLionel Sambuc   REGNO_X86_EDI = 7,
29472758f3SLionel Sambuc   REGNO_X86_EIP = 8,
30472758f3SLionel Sambuc };
31472758f3SLionel Sambuc 
32472758f3SLionel Sambuc class Registers_x86 {
33472758f3SLionel Sambuc public:
34472758f3SLionel Sambuc   enum {
35472758f3SLionel Sambuc     LAST_REGISTER = REGNO_X86_EIP,
36b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_X86_EIP,
37b029fb59SBen Gras     RETURN_OFFSET = 0,
38*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
39472758f3SLionel Sambuc   };
40472758f3SLionel Sambuc 
41472758f3SLionel Sambuc   __dso_hidden Registers_x86();
42472758f3SLionel Sambuc 
dwarf2regno(int num)43472758f3SLionel Sambuc   static int dwarf2regno(int num) { return num; }
44472758f3SLionel Sambuc 
validRegister(int num) const45472758f3SLionel Sambuc   bool validRegister(int num) const {
46472758f3SLionel Sambuc     return num >= REGNO_X86_EAX && num <= REGNO_X86_EDI;
47472758f3SLionel Sambuc   }
48472758f3SLionel Sambuc 
getRegister(int num) const49472758f3SLionel Sambuc   uint32_t getRegister(int num) const {
50472758f3SLionel Sambuc     assert(validRegister(num));
51472758f3SLionel Sambuc     return reg[num];
52472758f3SLionel Sambuc   }
53472758f3SLionel Sambuc 
setRegister(int num,uint32_t value)54472758f3SLionel Sambuc   void setRegister(int num, uint32_t value) {
55472758f3SLionel Sambuc     assert(validRegister(num));
56472758f3SLionel Sambuc     reg[num] = value;
57472758f3SLionel Sambuc   }
58472758f3SLionel Sambuc 
getIP() const59472758f3SLionel Sambuc   uint32_t getIP() const { return reg[REGNO_X86_EIP]; }
60472758f3SLionel Sambuc 
setIP(uint32_t value)61472758f3SLionel Sambuc   void setIP(uint32_t value) { reg[REGNO_X86_EIP] = value; }
62472758f3SLionel Sambuc 
getSP() const63472758f3SLionel Sambuc   uint32_t getSP() const { return reg[REGNO_X86_ESP]; }
64472758f3SLionel Sambuc 
setSP(uint32_t value)65472758f3SLionel Sambuc   void setSP(uint32_t value) { reg[REGNO_X86_ESP] = value; }
66472758f3SLionel Sambuc 
validFloatVectorRegister(int num) const67472758f3SLionel Sambuc   bool validFloatVectorRegister(int num) const { return false; }
68472758f3SLionel Sambuc 
copyFloatVectorRegister(int num,uint32_t addr)69472758f3SLionel Sambuc   void copyFloatVectorRegister(int num, uint32_t addr) {
70472758f3SLionel Sambuc   }
71472758f3SLionel Sambuc 
72472758f3SLionel Sambuc   __dso_hidden void jumpto() const __dead;
73472758f3SLionel Sambuc 
74472758f3SLionel Sambuc private:
75472758f3SLionel Sambuc   uint32_t reg[REGNO_X86_EIP + 1];
76472758f3SLionel Sambuc };
77472758f3SLionel Sambuc 
78472758f3SLionel Sambuc enum {
79472758f3SLionel Sambuc   REGNO_X86_64_RAX = 0,
80472758f3SLionel Sambuc   REGNO_X86_64_RDX = 1,
81472758f3SLionel Sambuc   REGNO_X86_64_RCX = 2,
82472758f3SLionel Sambuc   REGNO_X86_64_RBX = 3,
83472758f3SLionel Sambuc   REGNO_X86_64_RSI = 4,
84472758f3SLionel Sambuc   REGNO_X86_64_RDI = 5,
85472758f3SLionel Sambuc   REGNO_X86_64_RBP = 6,
86472758f3SLionel Sambuc   REGNO_X86_64_RSP = 7,
87472758f3SLionel Sambuc   REGNO_X86_64_R8 = 8,
88472758f3SLionel Sambuc   REGNO_X86_64_R9 = 9,
89472758f3SLionel Sambuc   REGNO_X86_64_R10 = 10,
90472758f3SLionel Sambuc   REGNO_X86_64_R11 = 11,
91472758f3SLionel Sambuc   REGNO_X86_64_R12 = 12,
92472758f3SLionel Sambuc   REGNO_X86_64_R13 = 13,
93472758f3SLionel Sambuc   REGNO_X86_64_R14 = 14,
94472758f3SLionel Sambuc   REGNO_X86_64_R15 = 15,
95472758f3SLionel Sambuc   REGNO_X86_64_RIP = 16,
96472758f3SLionel Sambuc };
97472758f3SLionel Sambuc 
98472758f3SLionel Sambuc class Registers_x86_64 {
99472758f3SLionel Sambuc public:
100472758f3SLionel Sambuc   enum {
101472758f3SLionel Sambuc     LAST_REGISTER = REGNO_X86_64_RIP,
102b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_X86_64_RIP,
103b029fb59SBen Gras     RETURN_OFFSET = 0,
104*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
105472758f3SLionel Sambuc   };
106472758f3SLionel Sambuc 
107472758f3SLionel Sambuc   __dso_hidden Registers_x86_64();
108472758f3SLionel Sambuc 
dwarf2regno(int num)109472758f3SLionel Sambuc   static int dwarf2regno(int num) { return num; }
110472758f3SLionel Sambuc 
validRegister(int num) const111472758f3SLionel Sambuc   bool validRegister(int num) const {
112472758f3SLionel Sambuc     return num >= REGNO_X86_64_RAX && num <= REGNO_X86_64_R15;
113472758f3SLionel Sambuc   }
114472758f3SLionel Sambuc 
getRegister(int num) const115472758f3SLionel Sambuc   uint64_t getRegister(int num) const {
116472758f3SLionel Sambuc     assert(validRegister(num));
117472758f3SLionel Sambuc     return reg[num];
118472758f3SLionel Sambuc   }
119472758f3SLionel Sambuc 
setRegister(int num,uint64_t value)120472758f3SLionel Sambuc   void setRegister(int num, uint64_t value) {
121472758f3SLionel Sambuc     assert(validRegister(num));
122472758f3SLionel Sambuc     reg[num] = value;
123472758f3SLionel Sambuc   }
124472758f3SLionel Sambuc 
getIP() const125472758f3SLionel Sambuc   uint64_t getIP() const { return reg[REGNO_X86_64_RIP]; }
126472758f3SLionel Sambuc 
setIP(uint64_t value)127472758f3SLionel Sambuc   void setIP(uint64_t value) { reg[REGNO_X86_64_RIP] = value; }
128472758f3SLionel Sambuc 
getSP() const129472758f3SLionel Sambuc   uint64_t getSP() const { return reg[REGNO_X86_64_RSP]; }
130472758f3SLionel Sambuc 
setSP(uint64_t value)131472758f3SLionel Sambuc   void setSP(uint64_t value) { reg[REGNO_X86_64_RSP] = value; }
132472758f3SLionel Sambuc 
validFloatVectorRegister(int num) const133472758f3SLionel Sambuc   bool validFloatVectorRegister(int num) const { return false; }
134472758f3SLionel Sambuc 
copyFloatVectorRegister(int num,uint64_t addr)135472758f3SLionel Sambuc   void copyFloatVectorRegister(int num, uint64_t addr) {
136472758f3SLionel Sambuc   }
137472758f3SLionel Sambuc 
138472758f3SLionel Sambuc   __dso_hidden void jumpto() const __dead;
139472758f3SLionel Sambuc 
140472758f3SLionel Sambuc private:
141472758f3SLionel Sambuc   uint64_t reg[REGNO_X86_64_RIP + 1];
142472758f3SLionel Sambuc };
143472758f3SLionel Sambuc 
144472758f3SLionel Sambuc enum {
145472758f3SLionel Sambuc   DWARF_PPC32_R0 = 0,
146472758f3SLionel Sambuc   DWARF_PPC32_R31 = 31,
147472758f3SLionel Sambuc   DWARF_PPC32_F0 = 32,
148472758f3SLionel Sambuc   DWARF_PPC32_F31 = 63,
149472758f3SLionel Sambuc   DWARF_PPC32_LR = 65,
150b029fb59SBen Gras   DWARF_PPC32_CR = 70,
151b029fb59SBen Gras   DWARF_PPC32_V0 = 77,
152b029fb59SBen Gras   DWARF_PPC32_V31 = 108,
153b029fb59SBen Gras 
154472758f3SLionel Sambuc   REGNO_PPC32_R0 = 0,
155b029fb59SBen Gras   REGNO_PPC32_R1 = 1,
156472758f3SLionel Sambuc   REGNO_PPC32_R31 = 31,
157b029fb59SBen Gras   REGNO_PPC32_LR = 32,
158b029fb59SBen Gras   REGNO_PPC32_CR = 33,
159b029fb59SBen Gras   REGNO_PPC32_SRR0 = 34,
160b029fb59SBen Gras 
161472758f3SLionel Sambuc   REGNO_PPC32_F0 = REGNO_PPC32_SRR0 + 1,
162472758f3SLionel Sambuc   REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31,
163472758f3SLionel Sambuc   REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1,
164472758f3SLionel Sambuc   REGNO_PPC32_V31 = REGNO_PPC32_V0 + 31,
165472758f3SLionel Sambuc };
166472758f3SLionel Sambuc 
167472758f3SLionel Sambuc class Registers_ppc32 {
168472758f3SLionel Sambuc public:
169472758f3SLionel Sambuc   enum {
170472758f3SLionel Sambuc     LAST_REGISTER = REGNO_PPC32_V31,
171b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_PPC32_V31,
172b029fb59SBen Gras     RETURN_OFFSET = 0,
173*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
174472758f3SLionel Sambuc   };
175472758f3SLionel Sambuc 
176472758f3SLionel Sambuc   __dso_hidden Registers_ppc32();
177472758f3SLionel Sambuc 
dwarf2regno(int num)178472758f3SLionel Sambuc   static int dwarf2regno(int num) {
179472758f3SLionel Sambuc     if (num >= DWARF_PPC32_R0 && num <= DWARF_PPC32_R31)
180472758f3SLionel Sambuc       return REGNO_PPC32_R0 + (num - DWARF_PPC32_R0);
181472758f3SLionel Sambuc     if (num >= DWARF_PPC32_F0 && num <= DWARF_PPC32_F31)
182472758f3SLionel Sambuc       return REGNO_PPC32_F0 + (num - DWARF_PPC32_F0);
183472758f3SLionel Sambuc     if (num >= DWARF_PPC32_V0 && num <= DWARF_PPC32_V31)
184472758f3SLionel Sambuc       return REGNO_PPC32_V0 + (num - DWARF_PPC32_V0);
185b029fb59SBen Gras     switch (num) {
186b029fb59SBen Gras     case DWARF_PPC32_LR:
187b029fb59SBen Gras       return REGNO_PPC32_LR;
188b029fb59SBen Gras     case DWARF_PPC32_CR:
189b029fb59SBen Gras       return REGNO_PPC32_CR;
190b029fb59SBen Gras     default:
191472758f3SLionel Sambuc       return LAST_REGISTER + 1;
192472758f3SLionel Sambuc     }
193b029fb59SBen Gras   }
194472758f3SLionel Sambuc 
validRegister(int num) const195472758f3SLionel Sambuc   bool validRegister(int num) const {
196472758f3SLionel Sambuc     return num >= 0 && num <= LAST_RESTORE_REG;
197472758f3SLionel Sambuc   }
198472758f3SLionel Sambuc 
getRegister(int num) const199472758f3SLionel Sambuc   uint64_t getRegister(int num) const {
200472758f3SLionel Sambuc     assert(validRegister(num));
201472758f3SLionel Sambuc     return reg[num];
202472758f3SLionel Sambuc   }
203472758f3SLionel Sambuc 
setRegister(int num,uint64_t value)204472758f3SLionel Sambuc   void setRegister(int num, uint64_t value) {
205472758f3SLionel Sambuc     assert(validRegister(num));
206472758f3SLionel Sambuc     reg[num] = value;
207472758f3SLionel Sambuc   }
208472758f3SLionel Sambuc 
getIP() const209472758f3SLionel Sambuc   uint64_t getIP() const { return reg[REGNO_PPC32_SRR0]; }
210472758f3SLionel Sambuc 
setIP(uint64_t value)211472758f3SLionel Sambuc   void setIP(uint64_t value) { reg[REGNO_PPC32_SRR0] = value; }
212472758f3SLionel Sambuc 
getSP() const213472758f3SLionel Sambuc   uint64_t getSP() const { return reg[REGNO_PPC32_R1]; }
214472758f3SLionel Sambuc 
setSP(uint64_t value)215472758f3SLionel Sambuc   void setSP(uint64_t value) { reg[REGNO_PPC32_R1] = value; }
216472758f3SLionel Sambuc 
validFloatVectorRegister(int num) const217472758f3SLionel Sambuc   bool validFloatVectorRegister(int num) const {
218472758f3SLionel Sambuc     return (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31) ||
219472758f3SLionel Sambuc            (num >= REGNO_PPC32_V0 && num <= REGNO_PPC32_V31);
220472758f3SLionel Sambuc   }
221472758f3SLionel Sambuc 
copyFloatVectorRegister(int num,uint64_t addr_)222472758f3SLionel Sambuc   void copyFloatVectorRegister(int num, uint64_t addr_) {
223472758f3SLionel Sambuc     const void *addr = reinterpret_cast<const void *>(addr_);
224472758f3SLionel Sambuc     if (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31)
225472758f3SLionel Sambuc       memcpy(fpreg + (num - REGNO_PPC32_F0), addr, sizeof(fpreg[0]));
226472758f3SLionel Sambuc     else
227472758f3SLionel Sambuc       memcpy(vecreg + (num - REGNO_PPC32_V0), addr, sizeof(vecreg[0]));
228472758f3SLionel Sambuc   }
229472758f3SLionel Sambuc 
230472758f3SLionel Sambuc   __dso_hidden void jumpto() const __dead;
231472758f3SLionel Sambuc 
232472758f3SLionel Sambuc private:
233472758f3SLionel Sambuc   struct vecreg_t {
234472758f3SLionel Sambuc     uint64_t low, high;
235472758f3SLionel Sambuc   };
236472758f3SLionel Sambuc   uint32_t reg[REGNO_PPC32_SRR0 + 1];
237b029fb59SBen Gras   uint32_t dummy;
238472758f3SLionel Sambuc   uint64_t fpreg[32];
239472758f3SLionel Sambuc   vecreg_t vecreg[64];
240472758f3SLionel Sambuc };
241472758f3SLionel Sambuc 
242b029fb59SBen Gras enum {
243*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_X0 = 0,
244*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_X30 = 30,
245*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_SP = 31,
246*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_ELR_MODE = 33,
247*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_V0 = 64,
248*0a6a1f1dSLionel Sambuc   DWARF_AARCH64_V31 = 95,
249*0a6a1f1dSLionel Sambuc 
250*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_X0 = 0,
251*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_X30 = 30,
252*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_SP = 31,
253*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_ELR_MODE = 32,
254*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_V0 = 33,
255*0a6a1f1dSLionel Sambuc   REGNO_AARCH64_V31 = 64,
256*0a6a1f1dSLionel Sambuc };
257*0a6a1f1dSLionel Sambuc 
258*0a6a1f1dSLionel Sambuc class Registers_aarch64 {
259*0a6a1f1dSLionel Sambuc public:
260*0a6a1f1dSLionel Sambuc   enum {
261*0a6a1f1dSLionel Sambuc     LAST_RESTORE_REG = REGNO_AARCH64_V31,
262*0a6a1f1dSLionel Sambuc     LAST_REGISTER = REGNO_AARCH64_V31,
263*0a6a1f1dSLionel Sambuc     RETURN_OFFSET = 0,
264*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
265*0a6a1f1dSLionel Sambuc   };
266*0a6a1f1dSLionel Sambuc 
267*0a6a1f1dSLionel Sambuc   __dso_hidden Registers_aarch64();
268*0a6a1f1dSLionel Sambuc 
dwarf2regno(int num)269*0a6a1f1dSLionel Sambuc   static int dwarf2regno(int num) {
270*0a6a1f1dSLionel Sambuc     if (num >= DWARF_AARCH64_X0 && num <= DWARF_AARCH64_X30)
271*0a6a1f1dSLionel Sambuc       return REGNO_AARCH64_X0 + (num - DWARF_AARCH64_X0);
272*0a6a1f1dSLionel Sambuc     if (num == DWARF_AARCH64_SP)
273*0a6a1f1dSLionel Sambuc       return REGNO_AARCH64_SP;
274*0a6a1f1dSLionel Sambuc     if (num == DWARF_AARCH64_ELR_MODE)
275*0a6a1f1dSLionel Sambuc       return REGNO_AARCH64_ELR_MODE;
276*0a6a1f1dSLionel Sambuc     if (num >= DWARF_AARCH64_V0 && num <= DWARF_AARCH64_V31)
277*0a6a1f1dSLionel Sambuc       return REGNO_AARCH64_V0 + (num - DWARF_AARCH64_V0);
278*0a6a1f1dSLionel Sambuc     return LAST_REGISTER + 1;
279*0a6a1f1dSLionel Sambuc   }
280*0a6a1f1dSLionel Sambuc 
validRegister(int num) const281*0a6a1f1dSLionel Sambuc   bool validRegister(int num) const {
282*0a6a1f1dSLionel Sambuc     return num >= 0 && num <= LAST_RESTORE_REG;
283*0a6a1f1dSLionel Sambuc   }
284*0a6a1f1dSLionel Sambuc 
getRegister(int num) const285*0a6a1f1dSLionel Sambuc   uint64_t getRegister(int num) const {
286*0a6a1f1dSLionel Sambuc     assert(validRegister(num));
287*0a6a1f1dSLionel Sambuc     return reg[num];
288*0a6a1f1dSLionel Sambuc   }
289*0a6a1f1dSLionel Sambuc 
setRegister(int num,uint64_t value)290*0a6a1f1dSLionel Sambuc   void setRegister(int num, uint64_t value) {
291*0a6a1f1dSLionel Sambuc     assert(validRegister(num));
292*0a6a1f1dSLionel Sambuc     reg[num] = value;
293*0a6a1f1dSLionel Sambuc   }
294*0a6a1f1dSLionel Sambuc 
getIP() const295*0a6a1f1dSLionel Sambuc   uint64_t getIP() const { return reg[REGNO_AARCH64_X30]; }
296*0a6a1f1dSLionel Sambuc 
setIP(uint64_t value)297*0a6a1f1dSLionel Sambuc   void setIP(uint64_t value) { reg[REGNO_AARCH64_X30] = value; }
298*0a6a1f1dSLionel Sambuc 
getSP() const299*0a6a1f1dSLionel Sambuc   uint64_t getSP() const { return reg[REGNO_AARCH64_SP]; }
300*0a6a1f1dSLionel Sambuc 
setSP(uint64_t value)301*0a6a1f1dSLionel Sambuc   void setSP(uint64_t value) { reg[REGNO_AARCH64_SP] = value; }
302*0a6a1f1dSLionel Sambuc 
validFloatVectorRegister(int num) const303*0a6a1f1dSLionel Sambuc   bool validFloatVectorRegister(int num) const {
304*0a6a1f1dSLionel Sambuc     return (num >= REGNO_AARCH64_V0 && num <= REGNO_AARCH64_V31);
305*0a6a1f1dSLionel Sambuc   }
306*0a6a1f1dSLionel Sambuc 
copyFloatVectorRegister(int num,uint64_t addr_)307*0a6a1f1dSLionel Sambuc   void copyFloatVectorRegister(int num, uint64_t addr_) {
308*0a6a1f1dSLionel Sambuc     const void *addr = reinterpret_cast<const void *>(addr_);
309*0a6a1f1dSLionel Sambuc     memcpy(vecreg + (num - REGNO_AARCH64_V0), addr, sizeof(vecreg[0]));
310*0a6a1f1dSLionel Sambuc   }
311*0a6a1f1dSLionel Sambuc 
312*0a6a1f1dSLionel Sambuc   __dso_hidden void jumpto() const __dead;
313*0a6a1f1dSLionel Sambuc 
314*0a6a1f1dSLionel Sambuc private:
315*0a6a1f1dSLionel Sambuc   struct vecreg_t {
316*0a6a1f1dSLionel Sambuc     uint64_t low, high;
317*0a6a1f1dSLionel Sambuc   };
318*0a6a1f1dSLionel Sambuc   uint64_t reg[REGNO_AARCH64_ELR_MODE + 1];
319*0a6a1f1dSLionel Sambuc   vecreg_t vecreg[32];
320*0a6a1f1dSLionel Sambuc };
321*0a6a1f1dSLionel Sambuc 
322*0a6a1f1dSLionel Sambuc enum {
323b029fb59SBen Gras   DWARF_ARM32_R0 = 0,
324b029fb59SBen Gras   DWARF_ARM32_R15 = 15,
325b029fb59SBen Gras   DWARF_ARM32_SPSR = 128,
326b029fb59SBen Gras   DWARF_ARM32_OLD_S0 = 64,
327b029fb59SBen Gras   DWARF_ARM32_OLD_S31 = 91,
328b029fb59SBen Gras   DWARF_ARM32_D0 = 256,
329b029fb59SBen Gras   DWARF_ARM32_D31 = 287,
330b029fb59SBen Gras   REGNO_ARM32_R0 = 0,
331b029fb59SBen Gras   REGNO_ARM32_SP = 13,
332b029fb59SBen Gras   REGNO_ARM32_R15 = 15,
333b029fb59SBen Gras   REGNO_ARM32_SPSR = 16,
334b029fb59SBen Gras   REGNO_ARM32_D0 = 17,
335b029fb59SBen Gras   REGNO_ARM32_D15 = 32,
336b029fb59SBen Gras   REGNO_ARM32_D31 = 48,
337b029fb59SBen Gras };
338b029fb59SBen Gras 
339b029fb59SBen Gras class Registers_arm32 {
340b029fb59SBen Gras public:
341b029fb59SBen Gras   enum {
342b029fb59SBen Gras     LAST_REGISTER = REGNO_ARM32_D31,
343b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_ARM32_D31,
344b029fb59SBen Gras     RETURN_OFFSET = 0,
345*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
346b029fb59SBen Gras   };
347b029fb59SBen Gras 
348b029fb59SBen Gras   __dso_hidden Registers_arm32();
349b029fb59SBen Gras 
dwarf2regno(int num)350b029fb59SBen Gras   static int dwarf2regno(int num) {
351b029fb59SBen Gras     if (num >= DWARF_ARM32_R0 && num <= DWARF_ARM32_R15)
352b029fb59SBen Gras       return REGNO_ARM32_R0 + (num - DWARF_ARM32_R0);
353b029fb59SBen Gras     if (num == DWARF_ARM32_SPSR)
354b029fb59SBen Gras       return REGNO_ARM32_SPSR;
355b029fb59SBen Gras     if (num >= DWARF_ARM32_D0 && num <= DWARF_ARM32_D31)
356b029fb59SBen Gras       return REGNO_ARM32_D0 + (num - DWARF_ARM32_D0);
357b029fb59SBen Gras     if (num >= DWARF_ARM32_OLD_S0 && num <= DWARF_ARM32_OLD_S31) {
358b029fb59SBen Gras       assert(num % 2 == 0);
359b029fb59SBen Gras       return REGNO_ARM32_D0 + (num - DWARF_ARM32_OLD_S0) / 2;
360b029fb59SBen Gras     }
361b029fb59SBen Gras     return LAST_REGISTER + 1;
362b029fb59SBen Gras   }
363b029fb59SBen Gras 
validRegister(int num) const364b029fb59SBen Gras   bool validRegister(int num) const {
365b029fb59SBen Gras     return num >= 0 && num <= REGNO_ARM32_SPSR;
366b029fb59SBen Gras   }
367b029fb59SBen Gras 
getRegister(int num) const368b029fb59SBen Gras   uint64_t getRegister(int num) const {
369b029fb59SBen Gras     assert(validRegister(num));
370b029fb59SBen Gras     return reg[num];
371b029fb59SBen Gras   }
372b029fb59SBen Gras 
setRegister(int num,uint64_t value)373b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
374b029fb59SBen Gras     assert(validRegister(num));
375b029fb59SBen Gras     reg[num] = value;
376b029fb59SBen Gras   }
377b029fb59SBen Gras 
getIP() const378b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_ARM32_R15]; }
379b029fb59SBen Gras 
setIP(uint64_t value)380b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_ARM32_R15] = value; }
381b029fb59SBen Gras 
getSP() const382b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_ARM32_SP]; }
383b029fb59SBen Gras 
setSP(uint64_t value)384b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_ARM32_SP] = value; }
385b029fb59SBen Gras 
validFloatVectorRegister(int num) const386b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
387b029fb59SBen Gras     return (num >= REGNO_ARM32_D0 && num <= REGNO_ARM32_D31);
388b029fb59SBen Gras   }
389b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)390b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
391b029fb59SBen Gras     if (num <= REGNO_ARM32_D15) {
392b029fb59SBen Gras       if ((flags & 1) == 0) {
393b029fb59SBen Gras         lazyVFP1();
394b029fb59SBen Gras         flags |= 1;
395b029fb59SBen Gras       }
396b029fb59SBen Gras     } else {
397b029fb59SBen Gras       if ((flags & 2) == 0) {
398b029fb59SBen Gras         lazyVFP3();
399b029fb59SBen Gras         flags |= 2;
400b029fb59SBen Gras       }
401b029fb59SBen Gras     }
402b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
403b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_ARM32_D0), addr, sizeof(fpreg[0]));
404b029fb59SBen Gras   }
405b029fb59SBen Gras 
406b029fb59SBen Gras   __dso_hidden void lazyVFP1();
407b029fb59SBen Gras   __dso_hidden void lazyVFP3();
408b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
409b029fb59SBen Gras 
410b029fb59SBen Gras private:
411b029fb59SBen Gras   uint32_t reg[REGNO_ARM32_SPSR + 1];
412b029fb59SBen Gras   uint32_t flags;
413b029fb59SBen Gras   uint64_t fpreg[32];
414b029fb59SBen Gras };
415b029fb59SBen Gras 
416b029fb59SBen Gras enum {
417b029fb59SBen Gras   DWARF_VAX_R0 = 0,
418b029fb59SBen Gras   DWARF_VAX_R15 = 15,
419b029fb59SBen Gras   DWARF_VAX_PSW = 16,
420b029fb59SBen Gras 
421b029fb59SBen Gras   REGNO_VAX_R0 = 0,
422b029fb59SBen Gras   REGNO_VAX_R14 = 14,
423b029fb59SBen Gras   REGNO_VAX_R15 = 15,
424b029fb59SBen Gras   REGNO_VAX_PSW = 16,
425b029fb59SBen Gras };
426b029fb59SBen Gras 
427b029fb59SBen Gras class Registers_vax {
428b029fb59SBen Gras public:
429b029fb59SBen Gras   enum {
430b029fb59SBen Gras     LAST_REGISTER = REGNO_VAX_PSW,
431b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_VAX_PSW,
432b029fb59SBen Gras     RETURN_OFFSET = 0,
433*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
434b029fb59SBen Gras   };
435b029fb59SBen Gras 
436b029fb59SBen Gras   __dso_hidden Registers_vax();
437b029fb59SBen Gras 
dwarf2regno(int num)438b029fb59SBen Gras   static int dwarf2regno(int num) {
439b029fb59SBen Gras     if (num >= DWARF_VAX_R0 && num <= DWARF_VAX_R15)
440b029fb59SBen Gras       return REGNO_VAX_R0 + (num - DWARF_VAX_R0);
441b029fb59SBen Gras     if (num == DWARF_VAX_PSW)
442b029fb59SBen Gras       return REGNO_VAX_PSW;
443b029fb59SBen Gras     return LAST_REGISTER + 1;
444b029fb59SBen Gras   }
445b029fb59SBen Gras 
validRegister(int num) const446b029fb59SBen Gras   bool validRegister(int num) const {
447b029fb59SBen Gras     return num >= 0 && num <= LAST_RESTORE_REG;
448b029fb59SBen Gras   }
449b029fb59SBen Gras 
getRegister(int num) const450b029fb59SBen Gras   uint64_t getRegister(int num) const {
451b029fb59SBen Gras     assert(validRegister(num));
452b029fb59SBen Gras     return reg[num];
453b029fb59SBen Gras   }
454b029fb59SBen Gras 
setRegister(int num,uint64_t value)455b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
456b029fb59SBen Gras     assert(validRegister(num));
457b029fb59SBen Gras     reg[num] = value;
458b029fb59SBen Gras   }
459b029fb59SBen Gras 
getIP() const460b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_VAX_R15]; }
461b029fb59SBen Gras 
setIP(uint64_t value)462b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_VAX_R15] = value; }
463b029fb59SBen Gras 
getSP() const464b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_VAX_R14]; }
465b029fb59SBen Gras 
setSP(uint64_t value)466b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_VAX_R14] = value; }
467b029fb59SBen Gras 
validFloatVectorRegister(int num) const468b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
469b029fb59SBen Gras     return false;
470b029fb59SBen Gras   }
471b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)472b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
473b029fb59SBen Gras   }
474b029fb59SBen Gras 
475b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
476b029fb59SBen Gras 
477b029fb59SBen Gras private:
478b029fb59SBen Gras   uint32_t reg[REGNO_VAX_PSW + 1];
479b029fb59SBen Gras };
480b029fb59SBen Gras 
481b029fb59SBen Gras enum {
482b029fb59SBen Gras   DWARF_M68K_A0 = 0,
483b029fb59SBen Gras   DWARF_M68K_A7 = 7,
484b029fb59SBen Gras   DWARF_M68K_D0 = 8,
485b029fb59SBen Gras   DWARF_M68K_D7 = 15,
486b029fb59SBen Gras   DWARF_M68K_FP0 = 16,
487b029fb59SBen Gras   DWARF_M68K_FP7 = 23,
488b029fb59SBen Gras   DWARF_M68K_PC = 24,
489b029fb59SBen Gras 
490b029fb59SBen Gras   REGNO_M68K_A0 = 0,
491b029fb59SBen Gras   REGNO_M68K_A7 = 7,
492b029fb59SBen Gras   REGNO_M68K_D0 = 8,
493b029fb59SBen Gras   REGNO_M68K_D7 = 15,
494b029fb59SBen Gras   REGNO_M68K_PC = 16,
495b029fb59SBen Gras   REGNO_M68K_FP0 = 17,
496b029fb59SBen Gras   REGNO_M68K_FP7 = 24,
497b029fb59SBen Gras };
498b029fb59SBen Gras 
499b029fb59SBen Gras class Registers_M68K {
500b029fb59SBen Gras public:
501b029fb59SBen Gras   enum {
502b029fb59SBen Gras     LAST_REGISTER = REGNO_M68K_FP7,
503b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_M68K_FP7,
504b029fb59SBen Gras     RETURN_OFFSET = 0,
505*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
506b029fb59SBen Gras   };
507b029fb59SBen Gras 
508b029fb59SBen Gras   __dso_hidden Registers_M68K();
509b029fb59SBen Gras 
dwarf2regno(int num)510b029fb59SBen Gras   static int dwarf2regno(int num) {
511b029fb59SBen Gras     if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7)
512b029fb59SBen Gras       return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
513b029fb59SBen Gras     if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
514b029fb59SBen Gras       return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
515b029fb59SBen Gras     if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7)
516b029fb59SBen Gras       return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0);
517b029fb59SBen Gras     if (num == DWARF_M68K_PC)
518b029fb59SBen Gras       return REGNO_M68K_PC;
519b029fb59SBen Gras     return LAST_REGISTER + 1;
520b029fb59SBen Gras   }
521b029fb59SBen Gras 
validRegister(int num) const522b029fb59SBen Gras   bool validRegister(int num) const {
523b029fb59SBen Gras     return num >= 0 && num <= REGNO_M68K_PC;
524b029fb59SBen Gras   }
525b029fb59SBen Gras 
getRegister(int num) const526b029fb59SBen Gras   uint64_t getRegister(int num) const {
527b029fb59SBen Gras     assert(validRegister(num));
528b029fb59SBen Gras     return reg[num];
529b029fb59SBen Gras   }
530b029fb59SBen Gras 
setRegister(int num,uint64_t value)531b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
532b029fb59SBen Gras     assert(validRegister(num));
533b029fb59SBen Gras     reg[num] = value;
534b029fb59SBen Gras   }
535b029fb59SBen Gras 
getIP() const536b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_M68K_PC]; }
537b029fb59SBen Gras 
setIP(uint64_t value)538b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; }
539b029fb59SBen Gras 
getSP() const540b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_M68K_A7]; }
541b029fb59SBen Gras 
setSP(uint64_t value)542b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; }
543b029fb59SBen Gras 
validFloatVectorRegister(int num) const544b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
545b029fb59SBen Gras     return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7;
546b029fb59SBen Gras   }
547b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)548b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
549b029fb59SBen Gras     assert(validFloatVectorRegister(num));
550b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
551b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0]));
552b029fb59SBen Gras   }
553b029fb59SBen Gras 
554b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
555b029fb59SBen Gras 
556b029fb59SBen Gras private:
557b029fb59SBen Gras   typedef uint32_t fpreg_t[3];
558b029fb59SBen Gras 
559b029fb59SBen Gras   uint32_t reg[REGNO_M68K_PC + 1];
560b029fb59SBen Gras   uint32_t dummy;
561b029fb59SBen Gras   fpreg_t fpreg[8];
562b029fb59SBen Gras };
563b029fb59SBen Gras 
564b029fb59SBen Gras enum {
565b029fb59SBen Gras   DWARF_SH3_R0 = 0,
566b029fb59SBen Gras   DWARF_SH3_R15 = 15,
567b029fb59SBen Gras   DWARF_SH3_PC = 16,
568b029fb59SBen Gras   DWARF_SH3_PR = 17,
569b029fb59SBen Gras 
570b029fb59SBen Gras   REGNO_SH3_R0 = 0,
571b029fb59SBen Gras   REGNO_SH3_R15 = 15,
572b029fb59SBen Gras   REGNO_SH3_PC = 16,
573b029fb59SBen Gras   REGNO_SH3_PR = 17,
574b029fb59SBen Gras };
575b029fb59SBen Gras 
576b029fb59SBen Gras class Registers_SH3 {
577b029fb59SBen Gras public:
578b029fb59SBen Gras   enum {
579b029fb59SBen Gras     LAST_REGISTER = REGNO_SH3_PR,
580b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_SH3_PR,
581b029fb59SBen Gras     RETURN_OFFSET = 0,
582*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
583b029fb59SBen Gras   };
584b029fb59SBen Gras 
585b029fb59SBen Gras   __dso_hidden Registers_SH3();
586b029fb59SBen Gras 
dwarf2regno(int num)587b029fb59SBen Gras   static int dwarf2regno(int num) {
588b029fb59SBen Gras     if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
589b029fb59SBen Gras       return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
590b029fb59SBen Gras     if (num == DWARF_SH3_PC)
591b029fb59SBen Gras       return REGNO_SH3_PC;
592b029fb59SBen Gras     if (num == DWARF_SH3_PR)
593b029fb59SBen Gras       return REGNO_SH3_PR;
594b029fb59SBen Gras     return LAST_REGISTER + 1;
595b029fb59SBen Gras   }
596b029fb59SBen Gras 
validRegister(int num) const597b029fb59SBen Gras   bool validRegister(int num) const {
598b029fb59SBen Gras     return num >= 0 && num <= REGNO_SH3_PR;
599b029fb59SBen Gras   }
600b029fb59SBen Gras 
getRegister(int num) const601b029fb59SBen Gras   uint64_t getRegister(int num) const {
602b029fb59SBen Gras     assert(validRegister(num));
603b029fb59SBen Gras     return reg[num];
604b029fb59SBen Gras   }
605b029fb59SBen Gras 
setRegister(int num,uint64_t value)606b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
607b029fb59SBen Gras     assert(validRegister(num));
608b029fb59SBen Gras     reg[num] = value;
609b029fb59SBen Gras   }
610b029fb59SBen Gras 
getIP() const611b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
612b029fb59SBen Gras 
setIP(uint64_t value)613b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
614b029fb59SBen Gras 
getSP() const615b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
616b029fb59SBen Gras 
setSP(uint64_t value)617b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
618b029fb59SBen Gras 
validFloatVectorRegister(int num) const619b029fb59SBen Gras   bool validFloatVectorRegister(int num) const { return false; }
620b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)621b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {}
622b029fb59SBen Gras 
623b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
624b029fb59SBen Gras 
625b029fb59SBen Gras private:
626b029fb59SBen Gras   uint32_t reg[REGNO_SH3_PR + 1];
627b029fb59SBen Gras };
628b029fb59SBen Gras 
629b029fb59SBen Gras enum {
630b029fb59SBen Gras   DWARF_SPARC64_R0 = 0,
631b029fb59SBen Gras   DWARF_SPARC64_R31 = 31,
632b029fb59SBen Gras   DWARF_SPARC64_PC = 32,
633b029fb59SBen Gras 
634b029fb59SBen Gras   REGNO_SPARC64_R0 = 0,
635b029fb59SBen Gras   REGNO_SPARC64_R14 = 14,
636b029fb59SBen Gras   REGNO_SPARC64_R15 = 15,
637b029fb59SBen Gras   REGNO_SPARC64_R31 = 31,
638b029fb59SBen Gras   REGNO_SPARC64_PC = 32,
639b029fb59SBen Gras };
640b029fb59SBen Gras 
641b029fb59SBen Gras class Registers_SPARC64 {
642b029fb59SBen Gras public:
643b029fb59SBen Gras   enum {
644b029fb59SBen Gras     LAST_REGISTER = REGNO_SPARC64_PC,
645b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_SPARC64_PC,
646b029fb59SBen Gras     RETURN_OFFSET = 8,
647*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
648b029fb59SBen Gras   };
649b029fb59SBen Gras   typedef uint64_t reg_t;
650b029fb59SBen Gras 
651b029fb59SBen Gras   __dso_hidden Registers_SPARC64();
652b029fb59SBen Gras 
dwarf2regno(int num)653b029fb59SBen Gras   static int dwarf2regno(int num) {
654b029fb59SBen Gras     if (num >= DWARF_SPARC64_R0 && num <= DWARF_SPARC64_R31)
655b029fb59SBen Gras       return REGNO_SPARC64_R0 + (num - DWARF_SPARC64_R0);
656b029fb59SBen Gras     if (num == DWARF_SPARC64_PC)
657b029fb59SBen Gras       return REGNO_SPARC64_PC;
658b029fb59SBen Gras     return LAST_REGISTER + 1;
659b029fb59SBen Gras   }
660b029fb59SBen Gras 
validRegister(int num) const661b029fb59SBen Gras   bool validRegister(int num) const {
662b029fb59SBen Gras     return num >= 0 && num <= REGNO_SPARC64_PC;
663b029fb59SBen Gras   }
664b029fb59SBen Gras 
getRegister(int num) const665b029fb59SBen Gras   uint64_t getRegister(int num) const {
666b029fb59SBen Gras     assert(validRegister(num));
667b029fb59SBen Gras     return reg[num];
668b029fb59SBen Gras   }
669b029fb59SBen Gras 
setRegister(int num,uint64_t value)670b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
671b029fb59SBen Gras     assert(validRegister(num));
672b029fb59SBen Gras     reg[num] = value;
673b029fb59SBen Gras   }
674b029fb59SBen Gras 
getIP() const675b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_SPARC64_PC]; }
676b029fb59SBen Gras 
setIP(uint64_t value)677b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_SPARC64_PC] = value; }
678b029fb59SBen Gras 
getSP() const679b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_SPARC64_R14]; }
680b029fb59SBen Gras 
setSP(uint64_t value)681b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_SPARC64_R14] = value; }
682b029fb59SBen Gras 
validFloatVectorRegister(int num) const683b029fb59SBen Gras   bool validFloatVectorRegister(int num) const { return false; }
684b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)685b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {}
686b029fb59SBen Gras 
687b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
688b029fb59SBen Gras 
689b029fb59SBen Gras private:
690b029fb59SBen Gras   uint64_t reg[REGNO_SPARC64_PC + 1];
691b029fb59SBen Gras };
692b029fb59SBen Gras 
693b029fb59SBen Gras enum {
694b029fb59SBen Gras   DWARF_SPARC_R0 = 0,
695b029fb59SBen Gras   DWARF_SPARC_R31 = 31,
696b029fb59SBen Gras   DWARF_SPARC_PC = 32,
697b029fb59SBen Gras 
698b029fb59SBen Gras   REGNO_SPARC_R0 = 0,
699b029fb59SBen Gras   REGNO_SPARC_R14 = 14,
700b029fb59SBen Gras   REGNO_SPARC_R15 = 15,
701b029fb59SBen Gras   REGNO_SPARC_R31 = 31,
702b029fb59SBen Gras   REGNO_SPARC_PC = 32,
703b029fb59SBen Gras };
704b029fb59SBen Gras 
705b029fb59SBen Gras class Registers_SPARC {
706b029fb59SBen Gras public:
707b029fb59SBen Gras   enum {
708b029fb59SBen Gras     LAST_REGISTER = REGNO_SPARC_PC,
709b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_SPARC_PC,
710b029fb59SBen Gras     RETURN_OFFSET = 8,
711*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
712b029fb59SBen Gras   };
713b029fb59SBen Gras   typedef uint32_t reg_t;
714b029fb59SBen Gras 
715b029fb59SBen Gras   __dso_hidden Registers_SPARC();
716b029fb59SBen Gras 
dwarf2regno(int num)717b029fb59SBen Gras   static int dwarf2regno(int num) {
718b029fb59SBen Gras     if (num >= DWARF_SPARC_R0 && num <= DWARF_SPARC_R31)
719b029fb59SBen Gras       return REGNO_SPARC_R0 + (num - DWARF_SPARC_R0);
720b029fb59SBen Gras     if (num == DWARF_SPARC_PC)
721b029fb59SBen Gras       return REGNO_SPARC_PC;
722b029fb59SBen Gras     return LAST_REGISTER + 1;
723b029fb59SBen Gras   }
724b029fb59SBen Gras 
validRegister(int num) const725b029fb59SBen Gras   bool validRegister(int num) const {
726b029fb59SBen Gras     return num >= 0 && num <= REGNO_SPARC_PC;
727b029fb59SBen Gras   }
728b029fb59SBen Gras 
getRegister(int num) const729b029fb59SBen Gras   uint64_t getRegister(int num) const {
730b029fb59SBen Gras     assert(validRegister(num));
731b029fb59SBen Gras     return reg[num];
732b029fb59SBen Gras   }
733b029fb59SBen Gras 
setRegister(int num,uint64_t value)734b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
735b029fb59SBen Gras     assert(validRegister(num));
736b029fb59SBen Gras     reg[num] = value;
737b029fb59SBen Gras   }
738b029fb59SBen Gras 
getIP() const739b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_SPARC_PC]; }
740b029fb59SBen Gras 
setIP(uint64_t value)741b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_SPARC_PC] = value; }
742b029fb59SBen Gras 
getSP() const743b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_SPARC_R14]; }
744b029fb59SBen Gras 
setSP(uint64_t value)745b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_SPARC_R14] = value; }
746b029fb59SBen Gras 
validFloatVectorRegister(int num) const747b029fb59SBen Gras   bool validFloatVectorRegister(int num) const { return false; }
748b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)749b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {}
750b029fb59SBen Gras 
751b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
752b029fb59SBen Gras 
753b029fb59SBen Gras private:
754b029fb59SBen Gras   uint32_t reg[REGNO_SPARC_PC + 1];
755b029fb59SBen Gras };
756b029fb59SBen Gras 
757b029fb59SBen Gras enum {
758b029fb59SBen Gras   DWARF_ALPHA_R0 = 0,
759b029fb59SBen Gras   DWARF_ALPHA_R30 = 30,
760b029fb59SBen Gras   DWARF_ALPHA_F0 = 32,
761b029fb59SBen Gras   DWARF_ALPHA_F30 = 62,
762b029fb59SBen Gras 
763b029fb59SBen Gras   REGNO_ALPHA_R0 = 0,
764b029fb59SBen Gras   REGNO_ALPHA_R26 = 26,
765b029fb59SBen Gras   REGNO_ALPHA_R30 = 30,
766b029fb59SBen Gras   REGNO_ALPHA_PC = 31,
767b029fb59SBen Gras   REGNO_ALPHA_F0 = 32,
768b029fb59SBen Gras   REGNO_ALPHA_F30 = 62,
769b029fb59SBen Gras };
770b029fb59SBen Gras 
771b029fb59SBen Gras class Registers_Alpha {
772b029fb59SBen Gras public:
773b029fb59SBen Gras   enum {
774b029fb59SBen Gras     LAST_REGISTER = REGNO_ALPHA_F30,
775b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_ALPHA_F30,
776b029fb59SBen Gras     RETURN_OFFSET = 0,
777*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
778b029fb59SBen Gras   };
779b029fb59SBen Gras   typedef uint32_t reg_t;
780b029fb59SBen Gras 
781b029fb59SBen Gras   __dso_hidden Registers_Alpha();
782b029fb59SBen Gras 
dwarf2regno(int num)783b029fb59SBen Gras   static int dwarf2regno(int num) { return num; }
784b029fb59SBen Gras 
validRegister(int num) const785b029fb59SBen Gras   bool validRegister(int num) const {
786b029fb59SBen Gras     return num >= 0 && num <= REGNO_ALPHA_PC;
787b029fb59SBen Gras   }
788b029fb59SBen Gras 
getRegister(int num) const789b029fb59SBen Gras   uint64_t getRegister(int num) const {
790b029fb59SBen Gras     assert(validRegister(num));
791b029fb59SBen Gras     return reg[num];
792b029fb59SBen Gras   }
793b029fb59SBen Gras 
setRegister(int num,uint64_t value)794b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
795b029fb59SBen Gras     assert(validRegister(num));
796b029fb59SBen Gras     reg[num] = value;
797b029fb59SBen Gras   }
798b029fb59SBen Gras 
getIP() const799b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_ALPHA_PC]; }
800b029fb59SBen Gras 
setIP(uint64_t value)801b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_ALPHA_PC] = value; }
802b029fb59SBen Gras 
getSP() const803b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_ALPHA_R30]; }
804b029fb59SBen Gras 
setSP(uint64_t value)805b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_ALPHA_R30] = value; }
806b029fb59SBen Gras 
validFloatVectorRegister(int num) const807b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
808b029fb59SBen Gras     return num >= REGNO_ALPHA_F0 && num <= REGNO_ALPHA_F30;
809b029fb59SBen Gras   }
810b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)811b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
812b029fb59SBen Gras     assert(validFloatVectorRegister(num));
813b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
814b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_ALPHA_F0), addr, sizeof(fpreg[0]));
815b029fb59SBen Gras   }
816b029fb59SBen Gras 
817b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
818b029fb59SBen Gras 
819b029fb59SBen Gras private:
820b029fb59SBen Gras   uint64_t reg[REGNO_ALPHA_PC + 1];
821b029fb59SBen Gras   uint64_t fpreg[31];
822b029fb59SBen Gras };
823b029fb59SBen Gras 
824b029fb59SBen Gras enum {
825b029fb59SBen Gras   DWARF_HPPA_R1 = 1,
826b029fb59SBen Gras   DWARF_HPPA_R31 = 31,
827b029fb59SBen Gras   DWARF_HPPA_FR4L = 32,
828b029fb59SBen Gras   DWARF_HPPA_FR31H = 87,
829b029fb59SBen Gras 
830b029fb59SBen Gras   REGNO_HPPA_PC = 0,
831b029fb59SBen Gras   REGNO_HPPA_R1 = 1,
832b029fb59SBen Gras   REGNO_HPPA_R2 = 2,
833b029fb59SBen Gras   REGNO_HPPA_R30 = 30,
834b029fb59SBen Gras   REGNO_HPPA_R31 = 31,
835b029fb59SBen Gras   REGNO_HPPA_FR4L = 32,
836b029fb59SBen Gras   REGNO_HPPA_FR31H = 87,
837b029fb59SBen Gras };
838b029fb59SBen Gras 
839b029fb59SBen Gras class Registers_HPPA {
840b029fb59SBen Gras public:
841b029fb59SBen Gras   enum {
842b029fb59SBen Gras     LAST_REGISTER = REGNO_HPPA_FR31H,
843b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_HPPA_FR31H,
844*0a6a1f1dSLionel Sambuc     RETURN_OFFSET = 0,
845*0a6a1f1dSLionel Sambuc     RETURN_MASK = 3,
846b029fb59SBen Gras   };
847b029fb59SBen Gras 
848b029fb59SBen Gras   __dso_hidden Registers_HPPA();
849b029fb59SBen Gras 
dwarf2regno(int num)850b029fb59SBen Gras   static int dwarf2regno(int num) {
851b029fb59SBen Gras     if (num >= DWARF_HPPA_R1 && num <= DWARF_HPPA_R31)
852b029fb59SBen Gras       return REGNO_HPPA_R1 + (num - DWARF_HPPA_R1);
853b029fb59SBen Gras     if (num >= DWARF_HPPA_FR4L && num <= DWARF_HPPA_FR31H)
854b029fb59SBen Gras       return REGNO_HPPA_FR4L + (num - DWARF_HPPA_FR31H);
855b029fb59SBen Gras     return LAST_REGISTER + 1;
856b029fb59SBen Gras   }
857b029fb59SBen Gras 
validRegister(int num) const858b029fb59SBen Gras   bool validRegister(int num) const {
859b029fb59SBen Gras     return num >= REGNO_HPPA_PC && num <= REGNO_HPPA_R31;
860b029fb59SBen Gras   }
861b029fb59SBen Gras 
getRegister(int num) const862b029fb59SBen Gras   uint64_t getRegister(int num) const {
863b029fb59SBen Gras     assert(validRegister(num));
864b029fb59SBen Gras     return reg[num];
865b029fb59SBen Gras   }
866b029fb59SBen Gras 
setRegister(int num,uint64_t value)867b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
868b029fb59SBen Gras     assert(validRegister(num));
869b029fb59SBen Gras     reg[num] = value;
870b029fb59SBen Gras   }
871b029fb59SBen Gras 
getIP() const872b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_HPPA_PC]; }
873b029fb59SBen Gras 
setIP(uint64_t value)874b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_HPPA_PC] = value; }
875b029fb59SBen Gras 
getSP() const876b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_HPPA_R30]; }
877b029fb59SBen Gras 
setSP(uint64_t value)878b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_HPPA_R30] = value; }
879b029fb59SBen Gras 
validFloatVectorRegister(int num) const880b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
881b029fb59SBen Gras     return num >= REGNO_HPPA_FR4L && num <= REGNO_HPPA_FR31H;
882b029fb59SBen Gras   }
883b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)884b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
885b029fb59SBen Gras     assert(validFloatVectorRegister(num));
886b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
887b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_HPPA_FR4L), addr, sizeof(fpreg[0]));
888b029fb59SBen Gras   }
889b029fb59SBen Gras 
890b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
891b029fb59SBen Gras 
892b029fb59SBen Gras private:
893b029fb59SBen Gras   uint32_t reg[REGNO_HPPA_R31 + 1];
894b029fb59SBen Gras   uint32_t fpreg[56];
895b029fb59SBen Gras };
896b029fb59SBen Gras 
897b029fb59SBen Gras enum {
898b029fb59SBen Gras   DWARF_MIPS_R1 = 0,
899b029fb59SBen Gras   DWARF_MIPS_R31 = 31,
900b029fb59SBen Gras   DWARF_MIPS_F0 = 32,
901b029fb59SBen Gras   DWARF_MIPS_F31 = 63,
902b029fb59SBen Gras 
903b029fb59SBen Gras   REGNO_MIPS_PC = 0,
904b029fb59SBen Gras   REGNO_MIPS_R1 = 0,
905b029fb59SBen Gras   REGNO_MIPS_R29 = 29,
906b029fb59SBen Gras   REGNO_MIPS_R31 = 31,
907b029fb59SBen Gras   REGNO_MIPS_F0 = 33,
908b029fb59SBen Gras   REGNO_MIPS_F31 = 64
909b029fb59SBen Gras };
910b029fb59SBen Gras 
911b029fb59SBen Gras class Registers_MIPS {
912b029fb59SBen Gras public:
913b029fb59SBen Gras   enum {
914b029fb59SBen Gras     LAST_REGISTER = REGNO_MIPS_F31,
915b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_MIPS_F31,
916b029fb59SBen Gras     RETURN_OFFSET = 0,
917*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
918b029fb59SBen Gras   };
919b029fb59SBen Gras 
920b029fb59SBen Gras   __dso_hidden Registers_MIPS();
921b029fb59SBen Gras 
dwarf2regno(int num)922b029fb59SBen Gras   static int dwarf2regno(int num) {
923b029fb59SBen Gras     if (num >= DWARF_MIPS_R1 && num <= DWARF_MIPS_R31)
924b029fb59SBen Gras       return REGNO_MIPS_R1 + (num - DWARF_MIPS_R1);
925b029fb59SBen Gras     if (num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31)
926b029fb59SBen Gras       return REGNO_MIPS_F0 + (num - DWARF_MIPS_F0);
927b029fb59SBen Gras     return LAST_REGISTER + 1;
928b029fb59SBen Gras   }
929b029fb59SBen Gras 
validRegister(int num) const930b029fb59SBen Gras   bool validRegister(int num) const {
931b029fb59SBen Gras     return num >= REGNO_MIPS_PC && num <= REGNO_MIPS_R31;
932b029fb59SBen Gras   }
933b029fb59SBen Gras 
getRegister(int num) const934b029fb59SBen Gras   uint64_t getRegister(int num) const {
935b029fb59SBen Gras     assert(validRegister(num));
936b029fb59SBen Gras     return reg[num];
937b029fb59SBen Gras   }
938b029fb59SBen Gras 
setRegister(int num,uint64_t value)939b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
940b029fb59SBen Gras     assert(validRegister(num));
941b029fb59SBen Gras     reg[num] = value;
942b029fb59SBen Gras   }
943b029fb59SBen Gras 
getIP() const944b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_MIPS_PC]; }
945b029fb59SBen Gras 
setIP(uint64_t value)946b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_MIPS_PC] = value; }
947b029fb59SBen Gras 
getSP() const948b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_MIPS_R29]; }
949b029fb59SBen Gras 
setSP(uint64_t value)950b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_MIPS_R29] = value; }
951b029fb59SBen Gras 
validFloatVectorRegister(int num) const952b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
953b029fb59SBen Gras     return num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31;
954b029fb59SBen Gras   }
955b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)956b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
957b029fb59SBen Gras     assert(validFloatVectorRegister(num));
958b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
959b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_MIPS_F0), addr, sizeof(fpreg[0]));
960b029fb59SBen Gras   }
961b029fb59SBen Gras 
962b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
963b029fb59SBen Gras 
964b029fb59SBen Gras private:
965b029fb59SBen Gras   uint32_t reg[REGNO_MIPS_R31 + 1];
966b029fb59SBen Gras   uint64_t fpreg[32];
967b029fb59SBen Gras };
968b029fb59SBen Gras 
969b029fb59SBen Gras enum {
970b029fb59SBen Gras   DWARF_MIPS64_R1 = 0,
971b029fb59SBen Gras   DWARF_MIPS64_R31 = 31,
972b029fb59SBen Gras   DWARF_MIPS64_F0 = 32,
973b029fb59SBen Gras   DWARF_MIPS64_F31 = 63,
974b029fb59SBen Gras 
975b029fb59SBen Gras   REGNO_MIPS64_PC = 0,
976b029fb59SBen Gras   REGNO_MIPS64_R1 = 0,
977b029fb59SBen Gras   REGNO_MIPS64_R29 = 29,
978b029fb59SBen Gras   REGNO_MIPS64_R31 = 31,
979b029fb59SBen Gras   REGNO_MIPS64_F0 = 33,
980b029fb59SBen Gras   REGNO_MIPS64_F31 = 64
981b029fb59SBen Gras };
982b029fb59SBen Gras 
983b029fb59SBen Gras class Registers_MIPS64 {
984b029fb59SBen Gras public:
985b029fb59SBen Gras   enum {
986b029fb59SBen Gras     LAST_REGISTER = REGNO_MIPS64_F31,
987b029fb59SBen Gras     LAST_RESTORE_REG = REGNO_MIPS64_F31,
988b029fb59SBen Gras     RETURN_OFFSET = 0,
989*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
990b029fb59SBen Gras   };
991b029fb59SBen Gras 
992b029fb59SBen Gras   __dso_hidden Registers_MIPS64();
993b029fb59SBen Gras 
dwarf2regno(int num)994b029fb59SBen Gras   static int dwarf2regno(int num) {
995b029fb59SBen Gras     if (num >= DWARF_MIPS64_R1 && num <= DWARF_MIPS64_R31)
996b029fb59SBen Gras       return REGNO_MIPS64_R1 + (num - DWARF_MIPS64_R1);
997b029fb59SBen Gras     if (num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31)
998b029fb59SBen Gras       return REGNO_MIPS64_F0 + (num - DWARF_MIPS64_F0);
999b029fb59SBen Gras     return LAST_REGISTER + 1;
1000b029fb59SBen Gras   }
1001b029fb59SBen Gras 
validRegister(int num) const1002b029fb59SBen Gras   bool validRegister(int num) const {
1003b029fb59SBen Gras     return num >= REGNO_MIPS64_PC && num <= REGNO_MIPS64_R31;
1004b029fb59SBen Gras   }
1005b029fb59SBen Gras 
getRegister(int num) const1006b029fb59SBen Gras   uint64_t getRegister(int num) const {
1007b029fb59SBen Gras     assert(validRegister(num));
1008b029fb59SBen Gras     return reg[num];
1009b029fb59SBen Gras   }
1010b029fb59SBen Gras 
setRegister(int num,uint64_t value)1011b029fb59SBen Gras   void setRegister(int num, uint64_t value) {
1012b029fb59SBen Gras     assert(validRegister(num));
1013b029fb59SBen Gras     reg[num] = value;
1014b029fb59SBen Gras   }
1015b029fb59SBen Gras 
getIP() const1016b029fb59SBen Gras   uint64_t getIP() const { return reg[REGNO_MIPS64_PC]; }
1017b029fb59SBen Gras 
setIP(uint64_t value)1018b029fb59SBen Gras   void setIP(uint64_t value) { reg[REGNO_MIPS64_PC] = value; }
1019b029fb59SBen Gras 
getSP() const1020b029fb59SBen Gras   uint64_t getSP() const { return reg[REGNO_MIPS64_R29]; }
1021b029fb59SBen Gras 
setSP(uint64_t value)1022b029fb59SBen Gras   void setSP(uint64_t value) { reg[REGNO_MIPS64_R29] = value; }
1023b029fb59SBen Gras 
validFloatVectorRegister(int num) const1024b029fb59SBen Gras   bool validFloatVectorRegister(int num) const {
1025b029fb59SBen Gras     return num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31;
1026b029fb59SBen Gras   }
1027b029fb59SBen Gras 
copyFloatVectorRegister(int num,uint64_t addr_)1028b029fb59SBen Gras   void copyFloatVectorRegister(int num, uint64_t addr_) {
1029b029fb59SBen Gras     assert(validFloatVectorRegister(num));
1030b029fb59SBen Gras     const void *addr = reinterpret_cast<const void *>(addr_);
1031b029fb59SBen Gras     memcpy(fpreg + (num - REGNO_MIPS64_F0), addr, sizeof(fpreg[0]));
1032b029fb59SBen Gras   }
1033b029fb59SBen Gras 
1034b029fb59SBen Gras   __dso_hidden void jumpto() const __dead;
1035b029fb59SBen Gras 
1036b029fb59SBen Gras private:
1037b029fb59SBen Gras   uint64_t reg[REGNO_MIPS64_R31 + 1];
1038b029fb59SBen Gras   uint64_t fpreg[32];
1039b029fb59SBen Gras };
1040b029fb59SBen Gras 
1041*0a6a1f1dSLionel Sambuc enum {
1042*0a6a1f1dSLionel Sambuc   DWARF_OR1K_R0 = 0,
1043*0a6a1f1dSLionel Sambuc   DWARF_OR1K_SP = 1,
1044*0a6a1f1dSLionel Sambuc   DWARF_OR1K_LR = 9,
1045*0a6a1f1dSLionel Sambuc   DWARF_OR1K_R31 = 31,
1046*0a6a1f1dSLionel Sambuc   DWARF_OR1K_FPCSR = 32,
1047*0a6a1f1dSLionel Sambuc 
1048*0a6a1f1dSLionel Sambuc   REGNO_OR1K_R0 = 0,
1049*0a6a1f1dSLionel Sambuc   REGNO_OR1K_SP = 1,
1050*0a6a1f1dSLionel Sambuc   REGNO_OR1K_LR = 9,
1051*0a6a1f1dSLionel Sambuc   REGNO_OR1K_R31 = 31,
1052*0a6a1f1dSLionel Sambuc   REGNO_OR1K_FPCSR = 32,
1053*0a6a1f1dSLionel Sambuc };
1054*0a6a1f1dSLionel Sambuc 
1055*0a6a1f1dSLionel Sambuc class Registers_or1k {
1056*0a6a1f1dSLionel Sambuc public:
1057*0a6a1f1dSLionel Sambuc   enum {
1058*0a6a1f1dSLionel Sambuc     LAST_REGISTER = REGNO_OR1K_FPCSR,
1059*0a6a1f1dSLionel Sambuc     LAST_RESTORE_REG = REGNO_OR1K_FPCSR,
1060*0a6a1f1dSLionel Sambuc     RETURN_OFFSET = 0,
1061*0a6a1f1dSLionel Sambuc     RETURN_MASK = 0,
1062*0a6a1f1dSLionel Sambuc   };
1063*0a6a1f1dSLionel Sambuc 
1064*0a6a1f1dSLionel Sambuc   __dso_hidden Registers_or1k();
1065*0a6a1f1dSLionel Sambuc 
dwarf2regno(int num)1066*0a6a1f1dSLionel Sambuc   static int dwarf2regno(int num) {
1067*0a6a1f1dSLionel Sambuc     if (num >= DWARF_OR1K_R0 && num <= DWARF_OR1K_R31)
1068*0a6a1f1dSLionel Sambuc       return REGNO_OR1K_R0 + (num - DWARF_OR1K_R0);
1069*0a6a1f1dSLionel Sambuc     if (num == DWARF_OR1K_FPCSR)
1070*0a6a1f1dSLionel Sambuc       return REGNO_OR1K_FPCSR;
1071*0a6a1f1dSLionel Sambuc     return LAST_REGISTER + 1;
1072*0a6a1f1dSLionel Sambuc   }
1073*0a6a1f1dSLionel Sambuc 
validRegister(int num) const1074*0a6a1f1dSLionel Sambuc   bool validRegister(int num) const {
1075*0a6a1f1dSLionel Sambuc     return num >= 0 && num <= LAST_RESTORE_REG;
1076*0a6a1f1dSLionel Sambuc   }
1077*0a6a1f1dSLionel Sambuc 
getRegister(int num) const1078*0a6a1f1dSLionel Sambuc   uint64_t getRegister(int num) const {
1079*0a6a1f1dSLionel Sambuc     assert(validRegister(num));
1080*0a6a1f1dSLionel Sambuc     return reg[num];
1081*0a6a1f1dSLionel Sambuc   }
1082*0a6a1f1dSLionel Sambuc 
setRegister(int num,uint64_t value)1083*0a6a1f1dSLionel Sambuc   void setRegister(int num, uint64_t value) {
1084*0a6a1f1dSLionel Sambuc     assert(validRegister(num));
1085*0a6a1f1dSLionel Sambuc     reg[num] = value;
1086*0a6a1f1dSLionel Sambuc   }
1087*0a6a1f1dSLionel Sambuc 
getIP() const1088*0a6a1f1dSLionel Sambuc   uint64_t getIP() const { return reg[REGNO_OR1K_LR]; }
1089*0a6a1f1dSLionel Sambuc 
setIP(uint64_t value)1090*0a6a1f1dSLionel Sambuc   void setIP(uint64_t value) { reg[REGNO_OR1K_LR] = value; }
1091*0a6a1f1dSLionel Sambuc 
getSP() const1092*0a6a1f1dSLionel Sambuc   uint64_t getSP() const { return reg[REGNO_OR1K_SP]; }
1093*0a6a1f1dSLionel Sambuc 
setSP(uint64_t value)1094*0a6a1f1dSLionel Sambuc   void setSP(uint64_t value) { reg[REGNO_OR1K_SP] = value; }
1095*0a6a1f1dSLionel Sambuc 
validFloatVectorRegister(int num) const1096*0a6a1f1dSLionel Sambuc   bool validFloatVectorRegister(int num) const {
1097*0a6a1f1dSLionel Sambuc     return false;
1098*0a6a1f1dSLionel Sambuc   }
1099*0a6a1f1dSLionel Sambuc 
copyFloatVectorRegister(int num,uint64_t addr_)1100*0a6a1f1dSLionel Sambuc   void copyFloatVectorRegister(int num, uint64_t addr_) {
1101*0a6a1f1dSLionel Sambuc   }
1102*0a6a1f1dSLionel Sambuc 
1103*0a6a1f1dSLionel Sambuc   __dso_hidden void jumpto() const __dead;
1104*0a6a1f1dSLionel Sambuc 
1105*0a6a1f1dSLionel Sambuc private:
1106*0a6a1f1dSLionel Sambuc   uint32_t reg[REGNO_OR1K_FPCSR + 1];
1107*0a6a1f1dSLionel Sambuc };
1108*0a6a1f1dSLionel Sambuc 
1109b029fb59SBen Gras #if __i386__
1110b029fb59SBen Gras typedef Registers_x86 NativeUnwindRegisters;
1111b029fb59SBen Gras #elif __x86_64__
1112b029fb59SBen Gras typedef Registers_x86_64 NativeUnwindRegisters;
1113b029fb59SBen Gras #elif __powerpc__
1114b029fb59SBen Gras typedef Registers_ppc32 NativeUnwindRegisters;
1115*0a6a1f1dSLionel Sambuc #elif __aarch64__
1116*0a6a1f1dSLionel Sambuc typedef Registers_aarch64 NativeUnwindRegisters;
1117b029fb59SBen Gras #elif __arm__
1118b029fb59SBen Gras typedef Registers_arm32 NativeUnwindRegisters;
1119b029fb59SBen Gras #elif __vax__
1120b029fb59SBen Gras typedef Registers_vax NativeUnwindRegisters;
1121b029fb59SBen Gras #elif __m68k__
1122b029fb59SBen Gras typedef Registers_M68K NativeUnwindRegisters;
1123b029fb59SBen Gras #elif __mips_n64 || __mips_n32
1124b029fb59SBen Gras typedef Registers_MIPS64 NativeUnwindRegisters;
1125b029fb59SBen Gras #elif __mips__
1126b029fb59SBen Gras typedef Registers_MIPS NativeUnwindRegisters;
1127b029fb59SBen Gras #elif __sh3__
1128b029fb59SBen Gras typedef Registers_SH3 NativeUnwindRegisters;
1129b029fb59SBen Gras #elif __sparc64__
1130b029fb59SBen Gras typedef Registers_SPARC64 NativeUnwindRegisters;
1131b029fb59SBen Gras #elif __sparc__
1132b029fb59SBen Gras typedef Registers_SPARC NativeUnwindRegisters;
1133b029fb59SBen Gras #elif __alpha__
1134b029fb59SBen Gras typedef Registers_Alpha NativeUnwindRegisters;
1135b029fb59SBen Gras #elif __hppa__
1136b029fb59SBen Gras typedef Registers_HPPA NativeUnwindRegisters;
1137*0a6a1f1dSLionel Sambuc #elif __or1k__
1138*0a6a1f1dSLionel Sambuc typedef Registers_or1k NativeUnwindRegisters;
1139b029fb59SBen Gras #endif
1140472758f3SLionel Sambuc } // namespace _Unwind
1141472758f3SLionel Sambuc 
1142472758f3SLionel Sambuc #endif // __REGISTERS_HPP__
1143