cap_instruction_api enabled for AIX/POWER.
[dyninst.git] / common / src / dyn_regs.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #define DYN_DEFINE_REGS
33 #include "dynutil/h/dyn_regs.h"
34
35 #include "external/rose/rose-compat.h"
36
37 using namespace Dyninst;
38
39 std::map<signed int, const char *> *Dyninst::MachRegister::names;
40
41 MachRegister::MachRegister() :
42    reg(0)
43
44 }
45
46 MachRegister::MachRegister(signed int r) :
47    reg(r)
48 {
49 }
50  
51 MachRegister::MachRegister(const MachRegister& r) :
52         reg(r.reg)
53 {
54 }
55
56 MachRegister::MachRegister(signed int r, const char *n) :
57    reg(r)
58 {
59    if (!names) {
60       names = new std::map<signed int, const char *>();
61    }
62    (*names)[r] = n;
63 }
64
65 MachRegister::~MachRegister() {
66 }
67
68 MachRegister MachRegister::getBaseRegister() const { 
69    switch (getArchitecture()) {
70       case Arch_x86:
71       case Arch_x86_64:
72         
73           return MachRegister(reg & 0xfffff0ff);
74       case Arch_ppc32:
75       case Arch_ppc64:
76           return MachRegister(reg & 0xfff0ffff);
77        case Arch_none:
78          return *this;
79    }
80    return InvalidReg;
81 }
82    
83 Architecture MachRegister::getArchitecture() const { 
84    return (Architecture) (reg & 0xff000000);
85 }
86
87 bool MachRegister::isValid() const {
88    return (reg != InvalidReg.reg);
89 }
90
91 MachRegisterVal MachRegister::getSubRegValue(const MachRegister subreg, 
92                                              MachRegisterVal &orig) const
93 {
94    if (subreg.reg == reg || 
95        getArchitecture() == Arch_ppc32 ||
96        getArchitecture() == Arch_ppc64)
97       return orig;
98
99    assert(subreg.getBaseRegister() == getBaseRegister());
100    switch ((subreg.reg & 0x00000f00) >> 8) {
101       case 0x0: return orig;
102       case 0x1: return (orig & 0xff);
103       case 0x2: return (orig & 0xff00) >> 8;              
104       case 0x3: return (orig & 0xffff);
105       case 0xf: return (orig & 0xffffffff);
106       default: assert(0); return orig;
107    }
108 }
109
110 const char *MachRegister::name() const { 
111    return (*names)[reg];
112 }
113
114 unsigned int MachRegister::size() const {
115    switch (getArchitecture())
116    {
117       case Arch_x86:
118          switch (reg & 0x0000ff00) {
119              case x86::L_REG: //L_REG
120             case x86::H_REG: //H_REG
121                return 1;
122                case x86::W_REG: //W_REG
123                return 2;
124                case x86::FULL: //FULL
125                return 4;
126              case x86::QUAD:
127                 return 8;
128              case x86::OCT:
129                  return 16;
130              case x86::FPDBL:
131                  return 10;
132          case x86::BIT:
133            return 0;
134              default:
135                assert(0);
136          }
137       case Arch_x86_64:
138          switch (reg & 0x0000ff00) {
139              case x86_64::L_REG: //L_REG
140              case x86_64::H_REG: //H_REG
141                 return 1;
142              case x86_64::W_REG: //W_REG
143                 return 2;
144              case x86_64::FULL: //FULL
145                 return 8;
146              case x86_64::D_REG:
147                  return 4;
148              case x86_64::OCT:
149                  return 16;
150              case x86_64::FPDBL:
151                  return 10;
152          case x86_64::BIT:
153            return 0;
154              default:
155                assert(0);
156          }
157       case Arch_ppc32: {
158          int reg_class = reg & 0x00ff0000;
159          if (reg_class == ppc32::FPR || reg_class == ppc32::FSR)
160             return 8;
161          return 4;
162       }
163       case Arch_ppc64:
164          return 8;
165       case Arch_none:
166          return 0;
167    }
168    return 0; //Unreachable, but disable warnings
169 }
170    
171 bool MachRegister::operator<(const MachRegister &a) const { 
172    return (reg < a.reg);
173 }
174  
175 bool MachRegister::operator==(const MachRegister &a) const { 
176    return (reg == a.reg);
177 }
178  
179 MachRegister::operator signed int() const {
180    return reg;
181 }
182
183 signed int MachRegister::val() const {
184    return reg;
185 }
186
187
188 MachRegister MachRegister::getPC(Dyninst::Architecture arch)
189 {
190    switch (arch)
191    {
192       case Arch_x86:
193          return x86::eip;
194       case Arch_x86_64:
195          return x86_64::rip;
196       case Arch_ppc32:
197          return ppc32::pc;
198       case Arch_ppc64:
199          return ppc64::pc;
200       case Arch_none:
201          return InvalidReg;
202    }
203    return InvalidReg;
204 }
205
206 MachRegister MachRegister::getFramePointer(Dyninst::Architecture arch)
207 {
208    switch (arch)
209    {
210       case Arch_x86:
211          return x86::ebp;
212       case Arch_x86_64:
213          return x86_64::rbp;
214       case Arch_ppc32:
215       case Arch_ppc64:
216          return FrameBase;
217       case Arch_none:
218          return InvalidReg;
219    }
220    return InvalidReg;
221 }
222
223 MachRegister MachRegister::getStackPointer(Dyninst::Architecture arch)
224 {
225    switch (arch)
226    {
227       case Arch_x86:
228          return x86::esp;
229       case Arch_x86_64:
230          return x86_64::rsp;
231       case Arch_ppc32:
232          return ppc32::r1;
233       case Arch_ppc64:
234          return ppc64::r1;
235       case Arch_none:
236          return InvalidReg;
237    }
238    return InvalidReg;
239 }
240
241 bool MachRegister::isPC() const
242 {
243    return (*this == x86_64::rip || *this == x86::eip ||
244            *this == ppc32::pc || *this == ppc64::pc);
245 }
246
247 bool MachRegister::isFramePointer() const
248 {
249    return (*this == x86_64::rbp || *this == x86::ebp ||
250            *this == FrameBase);
251 }
252
253 bool MachRegister::isStackPointer() const
254 {
255    return (*this == x86_64::rsp || *this == x86::esp ||
256            *this == ppc32::r1 || *this == ppc64::r1);
257 }
258
259 void MachRegister::getROSERegister(int &c, int &n, int &p)
260 {
261    // Rose: class, number, position
262    // Dyninst: category, base id, subrange
263
264    signed int category = (reg & 0x00ff0000);
265    signed int subrange = (reg & 0x0000ff00);
266    signed int baseID =   (reg & 0x000000ff);
267
268    switch (getArchitecture()) {
269       case Arch_x86:
270       case Arch_x86_64: // 64-bit not supported in ROSE
271          switch (category) {
272             case x86::GPR:
273                c = x86_regclass_gpr;
274                switch (baseID) {
275                   case x86::BASEA:
276                      n = x86_gpr_ax;
277                      break;
278                   case x86::BASEC:
279                      n = x86_gpr_cx;
280                      break;
281                   case x86::BASED:
282                      n = x86_gpr_dx;
283                      break;
284                   case x86::BASEB:
285                      n = x86_gpr_bx;
286                      break;
287                   case x86::BASESP:
288                      n = x86_gpr_sp;
289                      break;
290                   case x86::BASEBP:
291                      n = x86_gpr_bp;
292                      break;
293                   case x86::BASESI:
294                      n = x86_gpr_si;
295                      break;
296                   case x86::BASEDI:
297                      n = x86_gpr_di;
298                      break;
299                   default:
300                      n = 0;
301                      break;
302                }
303                break;
304             case x86::SEG:
305                c = x86_regclass_segment;
306                switch (baseID) {
307                   case 0x0:
308                      n = x86_segreg_ds;
309                      break;
310                   case 0x1:
311                      n = x86_segreg_es;
312                      break;
313                   case 0x2:
314                      n = x86_segreg_fs;
315                      break;
316                   case 0x3:
317                      n = x86_segreg_gs;
318                      break;
319                   case 0x4:
320                      n = x86_segreg_cs;
321                      break;
322                   case 0x5:
323                      n = x86_segreg_ss;
324                      break;
325                   default:
326                      n = 0;
327                      break;
328                }
329                break;
330             case x86::FLAG:
331                c = x86_regclass_flags;
332                switch(baseID) {
333                case x86::CF:
334                  n = x86_flag_cf;
335                  break;
336                case x86::PF:
337                  n = x86_flag_pf;
338                  break;
339                case x86::AF:
340                  n = x86_flag_af;
341                  break;
342                case x86::ZF:
343                  n = x86_flag_zf;
344                  break;
345                case x86::SF:
346                  n = x86_flag_sf;
347                  break;
348                case x86::TF:
349                  n = x86_flag_tf;
350                  break;
351                case x86::IF:
352                  n = x86_flag_if;
353                  break;
354                case x86::DF:
355                  n = x86_flag_df;
356                  break;
357                case x86::OF:
358                  n = x86_flag_of;
359                  break;
360                default:
361                  assert(0);
362                  break;
363                }
364                break;
365             case x86::MISC:
366                c = x86_regclass_unknown;
367                break;
368             case x86::XMM:
369                c = x86_regclass_xmm;
370                n = baseID;
371                break;
372             case x86::MMX:
373                c = x86_regclass_mm;
374                n = baseID;
375                break;
376             case x86::CTL:
377                c = x86_regclass_cr;
378                n = baseID;
379                break;
380             case x86::DBG:
381                c = x86_regclass_dr;
382                n = baseID;
383                break;
384             case x86::TST:
385                c = x86_regclass_unknown;
386                break;
387             case 0:
388                switch (baseID) {
389                   case 0x10:
390                      c = x86_regclass_ip;
391                      n = 0;
392                      break;
393                   default:
394                      c = x86_regclass_unknown;
395                      break;
396                }
397                break;
398          }
399          break;
400       default:
401          c = x86_regclass_unknown;
402          n = 0;
403          break;
404    }
405
406    switch (getArchitecture()) {
407       case Arch_x86:
408       case Arch_x86_64:
409          switch (subrange) {
410             case x86::FULL:
411             case x86::OCT:
412             case x86::FPDBL:
413                p = x86_regpos_all;
414                break;
415             case x86::H_REG:
416                p = x86_regpos_high_byte;
417                break;
418             case x86::L_REG:
419                p = x86_regpos_low_byte;
420                break;
421             case x86::W_REG:
422                p = x86_regpos_word;
423                break;
424             case x86_64::D_REG:
425                p = x86_regpos_dword;
426                break;
427             case x86::BIT:
428                p = x86_regpos_all;
429                break;
430          }
431          break;
432       default:
433         p = x86_regpos_unknown;
434    }
435 }
436
437 MachRegister MachRegister::DwarfEncToReg(int encoding, Dyninst::Architecture arch)
438 {
439    switch (arch)
440    {
441       case Arch_x86:
442          switch (encoding) {
443             case 0: return Dyninst::x86::eax;
444             case 1: return Dyninst::x86::ecx;
445             case 2: return Dyninst::x86::edx;
446             case 3: return Dyninst::x86::ebx;
447             case 4: return Dyninst::x86::esp;
448             case 5: return Dyninst::x86::ebp;
449             case 6: return Dyninst::x86::esi;
450             case 7: return Dyninst::x86::edi;
451             case 8: return Dyninst::x86::eip;
452             case 9: return Dyninst::x86::flags;
453             case 10: return Dyninst::InvalidReg;
454             case 11: return Dyninst::x86::st0;
455             case 12: return Dyninst::x86::st1;
456             case 13: return Dyninst::x86::st2;
457             case 14: return Dyninst::x86::st3;
458             case 15: return Dyninst::x86::st4;
459             case 16: return Dyninst::x86::st5;
460             case 17: return Dyninst::x86::st6;
461             case 18: return Dyninst::x86::st7;
462             case 19: return Dyninst::InvalidReg;
463             case 20: return Dyninst::InvalidReg;
464             case 21: return Dyninst::x86::xmm0;
465             case 22: return Dyninst::x86::xmm1;
466             case 23: return Dyninst::x86::xmm2;
467             case 24: return Dyninst::x86::xmm3;
468             case 25: return Dyninst::x86::xmm4;
469             case 26: return Dyninst::x86::xmm5;
470             case 27: return Dyninst::x86::xmm6;
471             case 28: return Dyninst::x86::xmm7;
472             case 29: return Dyninst::x86::mm0;
473             case 30: return Dyninst::x86::mm1;
474             case 31: return Dyninst::x86::mm2;
475             case 32: return Dyninst::x86::mm3;
476             case 33: return Dyninst::x86::mm4;
477             case 34: return Dyninst::x86::mm5;
478             case 35: return Dyninst::x86::mm6;
479             case 36: return Dyninst::x86::mm7;
480             case 37: return Dyninst::InvalidReg; //fcw
481             case 38: return Dyninst::InvalidReg; //fsw
482             case 39: return Dyninst::InvalidReg; //mxcsr
483             case 40: return Dyninst::x86::es;
484             case 41: return Dyninst::x86::cs;
485             case 42: return Dyninst::x86::ss;
486             case 43: return Dyninst::x86::ds;
487             case 44: return Dyninst::x86::fs;
488             case 45: return Dyninst::x86::gs;
489             case 46: return Dyninst::InvalidReg;
490             case 47: return Dyninst::InvalidReg;
491             case 48: return Dyninst::InvalidReg; //tr
492             case 49: return Dyninst::InvalidReg; //ldtr
493             default: return Dyninst::InvalidReg;
494          }
495          break;
496       case Arch_x86_64:
497          switch (encoding) {
498             case 0: return Dyninst::x86_64::rax;
499             case 1: return Dyninst::x86_64::rdx;
500             case 2: return Dyninst::x86_64::rcx;
501             case 3: return Dyninst::x86_64::rbx;
502             case 4: return Dyninst::x86_64::rsi;
503             case 5: return Dyninst::x86_64::rdi;
504             case 6: return Dyninst::x86_64::rbp;
505             case 7: return Dyninst::x86_64::rsp;
506             case 8: return Dyninst::x86_64::r8;
507             case 9: return Dyninst::x86_64::r9;
508             case 10: return Dyninst::x86_64::r10;
509             case 11: return Dyninst::x86_64::r11;
510             case 12: return Dyninst::x86_64::r12;
511             case 13: return Dyninst::x86_64::r13;
512             case 14: return Dyninst::x86_64::r14;
513             case 15: return Dyninst::x86_64::r15;
514             case 16: return Dyninst::x86_64::rip;
515             case 17: return Dyninst::x86_64::xmm0;
516             case 18: return Dyninst::x86_64::xmm1;
517             case 19: return Dyninst::x86_64::xmm2;
518             case 20: return Dyninst::x86_64::xmm3;
519             case 21: return Dyninst::x86_64::xmm4;
520             case 22: return Dyninst::x86_64::xmm5;
521             case 23: return Dyninst::x86_64::xmm6;
522             case 24: return Dyninst::x86_64::xmm7;
523             case 25: return Dyninst::x86_64::xmm8;
524             case 26: return Dyninst::x86_64::xmm9;
525             case 27: return Dyninst::x86_64::xmm10;
526             case 28: return Dyninst::x86_64::xmm11;
527             case 29: return Dyninst::x86_64::xmm12;
528             case 30: return Dyninst::x86_64::xmm13;
529             case 31: return Dyninst::x86_64::xmm14;
530             case 32: return Dyninst::x86_64::xmm15;
531             case 33: return Dyninst::x86_64::st0;
532             case 34: return Dyninst::x86_64::st1;
533             case 35: return Dyninst::x86_64::st2;
534             case 36: return Dyninst::x86_64::st3;
535             case 37: return Dyninst::x86_64::st4;
536             case 38: return Dyninst::x86_64::st5;
537             case 39: return Dyninst::x86_64::st6;
538             case 40: return Dyninst::x86_64::st7;
539             case 41: return Dyninst::x86_64::mm0;
540             case 42: return Dyninst::x86_64::mm1;
541             case 43: return Dyninst::x86_64::mm2;
542             case 44: return Dyninst::x86_64::mm3;
543             case 45: return Dyninst::x86_64::mm4;
544             case 46: return Dyninst::x86_64::mm5;
545             case 47: return Dyninst::x86_64::mm6;
546             case 48: return Dyninst::x86_64::mm7;
547             case 49: return Dyninst::x86_64::flags;
548             case 50: return Dyninst::x86_64::es;
549             case 51: return Dyninst::x86_64::cs;
550             case 52: return Dyninst::x86_64::ss;
551             case 53: return Dyninst::x86_64::ds;
552             case 54: return Dyninst::x86_64::fs;
553             case 55: return Dyninst::x86_64::gs;
554             case 56: return Dyninst::InvalidReg;
555             case 57: return Dyninst::InvalidReg;
556             case 58: return Dyninst::x86_64::fsbase;
557             case 59: return Dyninst::x86_64::gsbase;
558             case 60: return Dyninst::InvalidReg; 
559             case 61: return Dyninst::InvalidReg; 
560             case 62: return Dyninst::InvalidReg; //tr
561             case 63: return Dyninst::InvalidReg; //ldtr
562             case 64: return Dyninst::InvalidReg; //mxcsr
563             case 65: return Dyninst::InvalidReg; //fcw
564             case 66: return Dyninst::InvalidReg; //fsw
565          }
566          break;
567       case Arch_ppc32:
568          switch (encoding) {
569             case 0: return Dyninst::ppc32::r0;
570             case 1: return Dyninst::ppc32::r1;
571             case 2: return Dyninst::ppc32::r2;
572             case 3: return Dyninst::ppc32::r3;
573             case 4: return Dyninst::ppc32::r4;
574             case 5: return Dyninst::ppc32::r5;
575             case 6: return Dyninst::ppc32::r6;
576             case 7: return Dyninst::ppc32::r7;
577             case 8: return Dyninst::ppc32::r8;
578             case 9: return Dyninst::ppc32::r9;
579             case 10: return Dyninst::ppc32::r10;
580             case 11: return Dyninst::ppc32::r11;
581             case 12: return Dyninst::ppc32::r12;
582             case 13: return Dyninst::ppc32::r13;
583             case 14: return Dyninst::ppc32::r14;
584             case 15: return Dyninst::ppc32::r15;
585             case 16: return Dyninst::ppc32::r16;
586             case 17: return Dyninst::ppc32::r17;
587             case 18: return Dyninst::ppc32::r18;
588             case 19: return Dyninst::ppc32::r19;
589             case 20: return Dyninst::ppc32::r20;
590             case 21: return Dyninst::ppc32::r21;
591             case 22: return Dyninst::ppc32::r22;
592             case 23: return Dyninst::ppc32::r23;
593             case 24: return Dyninst::ppc32::r24;
594             case 25: return Dyninst::ppc32::r25;
595             case 26: return Dyninst::ppc32::r26;
596             case 27: return Dyninst::ppc32::r27;
597             case 28: return Dyninst::ppc32::r28;
598             case 29: return Dyninst::ppc32::r29;
599             case 30: return Dyninst::ppc32::r30;
600             case 31: return Dyninst::ppc32::r31;
601             case 32: return Dyninst::ppc32::fpr0;
602             case 33: return Dyninst::ppc32::fpr1;
603             case 34: return Dyninst::ppc32::fpr2;
604             case 35: return Dyninst::ppc32::fpr3;
605             case 36: return Dyninst::ppc32::fpr4;
606             case 37: return Dyninst::ppc32::fpr5;
607             case 38: return Dyninst::ppc32::fpr6;
608             case 39: return Dyninst::ppc32::fpr7;
609             case 40: return Dyninst::ppc32::fpr8;
610             case 41: return Dyninst::ppc32::fpr9;
611             case 42: return Dyninst::ppc32::fpr10;
612             case 43: return Dyninst::ppc32::fpr11;
613             case 44: return Dyninst::ppc32::fpr12;
614             case 45: return Dyninst::ppc32::fpr13;
615             case 46: return Dyninst::ppc32::fpr14;
616             case 47: return Dyninst::ppc32::fpr15;
617             case 48: return Dyninst::ppc32::fpr16;
618             case 49: return Dyninst::ppc32::fpr17;
619             case 50: return Dyninst::ppc32::fpr18;
620             case 51: return Dyninst::ppc32::fpr19;
621             case 52: return Dyninst::ppc32::fpr20;
622             case 53: return Dyninst::ppc32::fpr21;
623             case 54: return Dyninst::ppc32::fpr22;
624             case 55: return Dyninst::ppc32::fpr23;
625             case 56: return Dyninst::ppc32::fpr24;
626             case 57: return Dyninst::ppc32::fpr25;
627             case 58: return Dyninst::ppc32::fpr26;
628             case 59: return Dyninst::ppc32::fpr27;
629             case 60: return Dyninst::ppc32::fpr28;
630             case 61: return Dyninst::ppc32::fpr29;
631             case 62: return Dyninst::ppc32::fpr30;
632             case 63: return Dyninst::ppc32::fpr31;
633             case 64: return Dyninst::ppc32::cr;
634             case 65: return Dyninst::InvalidReg; //FPSCR
635          }
636          //Seperate switch statements to give compilers an easier time of 
637          // optimizing
638          switch (encoding) {
639             case 100: return Dyninst::ppc32::mq;
640             case 101: return Dyninst::ppc32::xer;
641             case 102: return Dyninst::InvalidReg;
642             case 103: return Dyninst::InvalidReg;
643             case 104: return Dyninst::InvalidReg; //RTCU
644             case 105: return Dyninst::InvalidReg; //RTCL
645             case 106: return Dyninst::InvalidReg;
646             case 107: return Dyninst::InvalidReg;
647             case 108: return Dyninst::ppc32::lr;
648             case 109: return Dyninst::ppc32::ctr;
649             default: return Dyninst::InvalidReg;
650          }
651          break;
652       case Arch_ppc64:
653          switch (encoding) {
654             case 0: return Dyninst::ppc64::r0;
655             case 1: return Dyninst::ppc64::r1;
656             case 2: return Dyninst::ppc64::r2;
657             case 3: return Dyninst::ppc64::r3;
658             case 4: return Dyninst::ppc64::r4;
659             case 5: return Dyninst::ppc64::r5;
660             case 6: return Dyninst::ppc64::r6;
661             case 7: return Dyninst::ppc64::r7;
662             case 8: return Dyninst::ppc64::r8;
663             case 9: return Dyninst::ppc64::r9;
664             case 10: return Dyninst::ppc64::r10;
665             case 11: return Dyninst::ppc64::r11;
666             case 12: return Dyninst::ppc64::r12;
667             case 13: return Dyninst::ppc64::r13;
668             case 14: return Dyninst::ppc64::r14;
669             case 15: return Dyninst::ppc64::r15;
670             case 16: return Dyninst::ppc64::r16;
671             case 17: return Dyninst::ppc64::r17;
672             case 18: return Dyninst::ppc64::r18;
673             case 19: return Dyninst::ppc64::r19;
674             case 20: return Dyninst::ppc64::r20;
675             case 21: return Dyninst::ppc64::r21;
676             case 22: return Dyninst::ppc64::r22;
677             case 23: return Dyninst::ppc64::r23;
678             case 24: return Dyninst::ppc64::r24;
679             case 25: return Dyninst::ppc64::r25;
680             case 26: return Dyninst::ppc64::r26;
681             case 27: return Dyninst::ppc64::r27;
682             case 28: return Dyninst::ppc64::r28;
683             case 29: return Dyninst::ppc64::r29;
684             case 30: return Dyninst::ppc64::r30;
685             case 31: return Dyninst::ppc64::r31;
686             case 32: return Dyninst::ppc64::fpr0;
687             case 33: return Dyninst::ppc64::fpr1;
688             case 34: return Dyninst::ppc64::fpr2;
689             case 35: return Dyninst::ppc64::fpr3;
690             case 36: return Dyninst::ppc64::fpr4;
691             case 37: return Dyninst::ppc64::fpr5;
692             case 38: return Dyninst::ppc64::fpr6;
693             case 39: return Dyninst::ppc64::fpr7;
694             case 40: return Dyninst::ppc64::fpr8;
695             case 41: return Dyninst::ppc64::fpr9;
696             case 42: return Dyninst::ppc64::fpr10;
697             case 43: return Dyninst::ppc64::fpr11;
698             case 44: return Dyninst::ppc64::fpr12;
699             case 45: return Dyninst::ppc64::fpr13;
700             case 46: return Dyninst::ppc64::fpr14;
701             case 47: return Dyninst::ppc64::fpr15;
702             case 48: return Dyninst::ppc64::fpr16;
703             case 49: return Dyninst::ppc64::fpr17;
704             case 50: return Dyninst::ppc64::fpr18;
705             case 51: return Dyninst::ppc64::fpr19;
706             case 52: return Dyninst::ppc64::fpr20;
707             case 53: return Dyninst::ppc64::fpr21;
708             case 54: return Dyninst::ppc64::fpr22;
709             case 55: return Dyninst::ppc64::fpr23;
710             case 56: return Dyninst::ppc64::fpr24;
711             case 57: return Dyninst::ppc64::fpr25;
712             case 58: return Dyninst::ppc64::fpr26;
713             case 59: return Dyninst::ppc64::fpr27;
714             case 60: return Dyninst::ppc64::fpr28;
715             case 61: return Dyninst::ppc64::fpr29;
716             case 62: return Dyninst::ppc64::fpr30;
717             case 63: return Dyninst::ppc64::fpr31;
718             case 64: return Dyninst::ppc64::cr;
719             case 65: return Dyninst::InvalidReg; //FPSCR
720          }
721          //Seperate switch statements to give compilers an easier time of 
722          // optimizing
723          switch (encoding) {
724             case 100: return Dyninst::ppc64::mq;
725             case 101: return Dyninst::ppc64::xer;
726             case 102: return Dyninst::InvalidReg;
727             case 103: return Dyninst::InvalidReg;
728             case 104: return Dyninst::InvalidReg; //RTCU
729             case 105: return Dyninst::InvalidReg; //RTCL
730             case 106: return Dyninst::InvalidReg;
731             case 107: return Dyninst::InvalidReg;
732             case 108: return Dyninst::ppc64::lr;
733             case 109: return Dyninst::ppc64::ctr;
734             default: return Dyninst::InvalidReg;
735          }
736          break;
737       case Arch_none:
738          return Dyninst::InvalidReg;
739          break;
740    }
741    //Invalid Architecture passed
742    return Dyninst::InvalidReg;
743
744 }
745
746 int MachRegister::getDwarfEnc() const
747 {
748    switch (getArchitecture())
749    {
750       case Arch_x86:
751          switch (val()) {
752             case Dyninst::x86::ieax: return 0;
753             case Dyninst::x86::iecx: return 1;
754             case Dyninst::x86::iedx: return 2;
755             case Dyninst::x86::iebx: return 3;
756             case Dyninst::x86::iesp: return 4;
757             case Dyninst::x86::iebp: return 5;
758             case Dyninst::x86::iesi: return 6;
759             case Dyninst::x86::iedi: return 7;
760             case Dyninst::x86::ieip: return 8;
761             case Dyninst::x86::iflags: return 9;
762             case Dyninst::x86::ixmm0: return 21;
763             case Dyninst::x86::ixmm1: return 22;
764             case Dyninst::x86::ixmm2: return 23;
765             case Dyninst::x86::ixmm3: return 24;
766             case Dyninst::x86::ixmm4: return 25;
767             case Dyninst::x86::ixmm5: return 26;
768             case Dyninst::x86::ixmm6: return 27;
769             case Dyninst::x86::ixmm7: return 28;
770             case Dyninst::x86::imm0: return 29;
771             case Dyninst::x86::imm1: return 30;
772             case Dyninst::x86::imm2: return 31;
773             case Dyninst::x86::imm3: return 32;
774             case Dyninst::x86::imm4: return 33;
775             case Dyninst::x86::imm5: return 34;
776             case Dyninst::x86::imm6: return 35;
777             case Dyninst::x86::imm7: return 36;
778             case Dyninst::x86::ies: return 40;
779             case Dyninst::x86::ics: return 41;
780             case Dyninst::x86::iss: return 42;
781             case Dyninst::x86::ids: return 43;
782             case Dyninst::x86::ifs: return 44;
783             case Dyninst::x86::igs: return 45;
784             default: return -1;
785          }
786          break;
787       case Arch_x86_64:
788          switch (val()) {
789             case Dyninst::x86_64::irax: return 0;
790             case Dyninst::x86_64::irdx: return 1;
791             case Dyninst::x86_64::ircx: return 2;
792             case Dyninst::x86_64::irbx: return 3;
793             case Dyninst::x86_64::irsi: return 4;
794             case Dyninst::x86_64::irdi: return 5;
795             case Dyninst::x86_64::irbp: return 6;
796             case Dyninst::x86_64::irsp: return 7;
797             case Dyninst::x86_64::ir8: return 8;
798             case Dyninst::x86_64::ir9: return 9;
799             case Dyninst::x86_64::ir10: return 10;
800             case Dyninst::x86_64::ir11: return 11;
801             case Dyninst::x86_64::ir12: return 12;
802             case Dyninst::x86_64::ir13: return 13;
803             case Dyninst::x86_64::ir14: return 14;
804             case Dyninst::x86_64::ir15: return 15;
805             case Dyninst::x86_64::irip: return 16;
806             case Dyninst::x86_64::ixmm0: return 17;
807             case Dyninst::x86_64::ixmm1: return 18;
808             case Dyninst::x86_64::ixmm2: return 19;
809             case Dyninst::x86_64::ixmm3: return 20;
810             case Dyninst::x86_64::ixmm4: return 21;
811             case Dyninst::x86_64::ixmm5: return 22;
812             case Dyninst::x86_64::ixmm6: return 23;
813             case Dyninst::x86_64::ixmm7: return 24;
814             case Dyninst::x86_64::ixmm8: return 25;
815             case Dyninst::x86_64::ixmm9: return 26;
816             case Dyninst::x86_64::ixmm10: return 27;
817             case Dyninst::x86_64::ixmm11: return 28;
818             case Dyninst::x86_64::ixmm12: return 29;
819             case Dyninst::x86_64::ixmm13: return 30;
820             case Dyninst::x86_64::ixmm14: return 31;
821             case Dyninst::x86_64::ixmm15: return 32;
822             case Dyninst::x86_64::imm0: return 41;
823             case Dyninst::x86_64::imm1: return 42;
824             case Dyninst::x86_64::imm2: return 43;
825             case Dyninst::x86_64::imm3: return 44;
826             case Dyninst::x86_64::imm4: return 45;
827             case Dyninst::x86_64::imm5: return 46;
828             case Dyninst::x86_64::imm6: return 47;
829             case Dyninst::x86_64::imm7: return 48;
830             case Dyninst::x86_64::iflags: return 49;
831             case Dyninst::x86_64::ies: return 50;
832             case Dyninst::x86_64::ics: return 51;
833             case Dyninst::x86_64::iss: return 52;
834             case Dyninst::x86_64::ids: return 53;
835             case Dyninst::x86_64::ifs: return 54;
836             case Dyninst::x86_64::igs: return 55;
837             case Dyninst::x86_64::ifsbase: return 58;
838             case Dyninst::x86_64::igsbase: return 59;
839             default: return -1;
840          }
841          break;
842       case Arch_ppc32:
843          switch (val()) {
844             case Dyninst::ppc32::ir0: return 0;
845             case Dyninst::ppc32::ir1: return 1;
846             case Dyninst::ppc32::ir2: return 2;
847             case Dyninst::ppc32::ir3: return 3;
848             case Dyninst::ppc32::ir4: return 4;
849             case Dyninst::ppc32::ir5: return 5;
850             case Dyninst::ppc32::ir6: return 6;
851             case Dyninst::ppc32::ir7: return 7;
852             case Dyninst::ppc32::ir8: return 8;
853             case Dyninst::ppc32::ir9: return 9;
854             case Dyninst::ppc32::ir10: return 10;
855             case Dyninst::ppc32::ir11: return 11;
856             case Dyninst::ppc32::ir12: return 12;
857             case Dyninst::ppc32::ir13: return 13;
858             case Dyninst::ppc32::ir14: return 14;
859             case Dyninst::ppc32::ir15: return 15;
860             case Dyninst::ppc32::ir16: return 16;
861             case Dyninst::ppc32::ir17: return 17;
862             case Dyninst::ppc32::ir18: return 18;
863             case Dyninst::ppc32::ir19: return 19;
864             case Dyninst::ppc32::ir20: return 20;
865             case Dyninst::ppc32::ir21: return 21;
866             case Dyninst::ppc32::ir22: return 22;
867             case Dyninst::ppc32::ir23: return 23;
868             case Dyninst::ppc32::ir24: return 24;
869             case Dyninst::ppc32::ir25: return 25;
870             case Dyninst::ppc32::ir26: return 26;
871             case Dyninst::ppc32::ir27: return 27;
872             case Dyninst::ppc32::ir28: return 28;
873             case Dyninst::ppc32::ir29: return 29;
874             case Dyninst::ppc32::ir30: return 30;
875             case Dyninst::ppc32::ir31: return 31;
876             case Dyninst::ppc32::ifpr0: return 32;
877             case Dyninst::ppc32::ifpr1: return 33;
878             case Dyninst::ppc32::ifpr2: return 34;
879             case Dyninst::ppc32::ifpr3: return 35;
880             case Dyninst::ppc32::ifpr4: return 36;
881             case Dyninst::ppc32::ifpr5: return 37;
882             case Dyninst::ppc32::ifpr6: return 38;
883             case Dyninst::ppc32::ifpr7: return 39;
884             case Dyninst::ppc32::ifpr8: return 40;
885             case Dyninst::ppc32::ifpr9: return 41;
886             case Dyninst::ppc32::ifpr10: return 42;
887             case Dyninst::ppc32::ifpr11: return 43;
888             case Dyninst::ppc32::ifpr12: return 44;
889             case Dyninst::ppc32::ifpr13: return 45;
890             case Dyninst::ppc32::ifpr14: return 46;
891             case Dyninst::ppc32::ifpr15: return 47;
892             case Dyninst::ppc32::ifpr16: return 48;
893             case Dyninst::ppc32::ifpr17: return 49;
894             case Dyninst::ppc32::ifpr18: return 50;
895             case Dyninst::ppc32::ifpr19: return 51;
896             case Dyninst::ppc32::ifpr20: return 52;
897             case Dyninst::ppc32::ifpr21: return 53;
898             case Dyninst::ppc32::ifpr22: return 54;
899             case Dyninst::ppc32::ifpr23: return 55;
900             case Dyninst::ppc32::ifpr24: return 56;
901             case Dyninst::ppc32::ifpr25: return 57;
902             case Dyninst::ppc32::ifpr26: return 58;
903             case Dyninst::ppc32::ifpr27: return 59;
904             case Dyninst::ppc32::ifpr28: return 60;
905             case Dyninst::ppc32::ifpr29: return 61;
906             case Dyninst::ppc32::ifpr30: return 62;
907             case Dyninst::ppc32::ifpr31: return 63;
908             case Dyninst::ppc32::icr: return 64;
909             case Dyninst::ppc32::imq: return 100;
910             case Dyninst::ppc32::ixer: return 101;
911             case Dyninst::ppc32::ilr: return 108;
912             case Dyninst::ppc32::ictr: return 109;
913             default: return -1;
914          }
915       case Arch_ppc64:
916          switch (val()) {
917             case Dyninst::ppc64::ir0: return 0;
918             case Dyninst::ppc64::ir1: return 1;
919             case Dyninst::ppc64::ir2: return 2;
920             case Dyninst::ppc64::ir3: return 3;
921             case Dyninst::ppc64::ir4: return 4;
922             case Dyninst::ppc64::ir5: return 5;
923             case Dyninst::ppc64::ir6: return 6;
924             case Dyninst::ppc64::ir7: return 7;
925             case Dyninst::ppc64::ir8: return 8;
926             case Dyninst::ppc64::ir9: return 9;
927             case Dyninst::ppc64::ir10: return 10;
928             case Dyninst::ppc64::ir11: return 11;
929             case Dyninst::ppc64::ir12: return 12;
930             case Dyninst::ppc64::ir13: return 13;
931             case Dyninst::ppc64::ir14: return 14;
932             case Dyninst::ppc64::ir15: return 15;
933             case Dyninst::ppc64::ir16: return 16;
934             case Dyninst::ppc64::ir17: return 17;
935             case Dyninst::ppc64::ir18: return 18;
936             case Dyninst::ppc64::ir19: return 19;
937             case Dyninst::ppc64::ir20: return 20;
938             case Dyninst::ppc64::ir21: return 21;
939             case Dyninst::ppc64::ir22: return 22;
940             case Dyninst::ppc64::ir23: return 23;
941             case Dyninst::ppc64::ir24: return 24;
942             case Dyninst::ppc64::ir25: return 25;
943             case Dyninst::ppc64::ir26: return 26;
944             case Dyninst::ppc64::ir27: return 27;
945             case Dyninst::ppc64::ir28: return 28;
946             case Dyninst::ppc64::ir29: return 29;
947             case Dyninst::ppc64::ir30: return 30;
948             case Dyninst::ppc64::ir31: return 31;
949             case Dyninst::ppc64::ifpr0: return 32;
950             case Dyninst::ppc64::ifpr1: return 33;
951             case Dyninst::ppc64::ifpr2: return 34;
952             case Dyninst::ppc64::ifpr3: return 35;
953             case Dyninst::ppc64::ifpr4: return 36;
954             case Dyninst::ppc64::ifpr5: return 37;
955             case Dyninst::ppc64::ifpr6: return 38;
956             case Dyninst::ppc64::ifpr7: return 39;
957             case Dyninst::ppc64::ifpr8: return 40;
958             case Dyninst::ppc64::ifpr9: return 41;
959             case Dyninst::ppc64::ifpr10: return 42;
960             case Dyninst::ppc64::ifpr11: return 43;
961             case Dyninst::ppc64::ifpr12: return 44;
962             case Dyninst::ppc64::ifpr13: return 45;
963             case Dyninst::ppc64::ifpr14: return 46;
964             case Dyninst::ppc64::ifpr15: return 47;
965             case Dyninst::ppc64::ifpr16: return 48;
966             case Dyninst::ppc64::ifpr17: return 49;
967             case Dyninst::ppc64::ifpr18: return 50;
968             case Dyninst::ppc64::ifpr19: return 51;
969             case Dyninst::ppc64::ifpr20: return 52;
970             case Dyninst::ppc64::ifpr21: return 53;
971             case Dyninst::ppc64::ifpr22: return 54;
972             case Dyninst::ppc64::ifpr23: return 55;
973             case Dyninst::ppc64::ifpr24: return 56;
974             case Dyninst::ppc64::ifpr25: return 57;
975             case Dyninst::ppc64::ifpr26: return 58;
976             case Dyninst::ppc64::ifpr27: return 59;
977             case Dyninst::ppc64::ifpr28: return 60;
978             case Dyninst::ppc64::ifpr29: return 61;
979             case Dyninst::ppc64::ifpr30: return 62;
980             case Dyninst::ppc64::ifpr31: return 63;
981             case Dyninst::ppc64::icr: return 64;
982             case Dyninst::ppc64::imq: return 100;
983             case Dyninst::ppc64::ixer: return 101;
984             case Dyninst::ppc64::ilr: return 108;
985             case Dyninst::ppc64::ictr: return 109;
986             default: return -1;
987          }
988          break;
989       case Arch_none:
990          return -1;
991    }
992    //Invalid register passed
993    return -1;
994 }