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