1. Create an architecture independent interface to get the zero flag register and...
[dyninst.git] / common / src / dyn_regs.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  *
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  *
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  *
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  *
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  *
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #define DYN_DEFINE_REGS
32 #include "common/h/dyn_regs.h"
33
34 #include "external/rose/rose-compat.h"
35 #include "external/rose/powerpcInstructionEnum.h"
36 #include "external/rose/armv8InstructionEnum.h"
37
38 #include <iostream>
39
40 using namespace Dyninst;
41
42 boost::shared_ptr<MachRegister::NameMap> MachRegister::names()
43 {
44     static boost::shared_ptr<MachRegister::NameMap> store =
45        boost::shared_ptr<MachRegister::NameMap>(new MachRegister::NameMap);
46     return store;
47 }
48
49 MachRegister::MachRegister() :
50    reg(0)
51 {
52 }
53
54 MachRegister::MachRegister(signed int r) :
55    reg(r)
56 {
57 }
58
59 MachRegister::MachRegister(signed int r, const char *n) :
60    reg(r)
61 {
62         (*names())[r] = std::string(n);
63 }
64
65 MachRegister::MachRegister(signed int r, std::string n) :
66 reg(r)
67 {
68         (*names())[r] = n;
69 }
70
71 unsigned int MachRegister::regClass() const
72 {
73     return reg & 0x00ff0000;
74 }
75
76 MachRegister MachRegister::getBaseRegister() const {
77    switch (getArchitecture()) {
78       case Arch_x86:
79          if (reg & x86::GPR) return MachRegister(reg & 0xfffff0ff);
80          else return *this;
81       case Arch_x86_64:
82          if (reg & x86_64::GPR) return MachRegister(reg & 0xfffff0ff);
83          else return *this;
84       case Arch_ppc32:
85       case Arch_ppc64:
86       case Arch_none:
87          return *this;
88                 case Arch_aarch32:
89                 case Arch_aarch64:
90                                   //not verified
91                    return *this;
92    }
93    return InvalidReg;
94 }
95
96 Architecture MachRegister::getArchitecture() const {
97    return (Architecture) (reg & 0xff000000);
98 }
99
100 bool MachRegister::isValid() const {
101    return (reg != InvalidReg.reg);
102 }
103
104 MachRegisterVal MachRegister::getSubRegValue(const MachRegister& subreg,
105                                              MachRegisterVal &orig) const
106 {
107    if (subreg.reg == reg ||
108        getArchitecture() == Arch_ppc32 ||
109        getArchitecture() == Arch_ppc64)
110       return orig;
111
112    assert(subreg.getBaseRegister() == getBaseRegister());
113    switch ((subreg.reg & 0x00000f00) >> 8) {
114       case 0x0: return orig;
115       case 0x1: return (orig & 0xff);
116       case 0x2: return (orig & 0xff00) >> 8;
117       case 0x3: return (orig & 0xffff);
118       case 0xf: return (orig & 0xffffffff);
119       default: assert(0); return orig;
120    }
121 }
122
123 std::string MachRegister::name() const {
124         assert(names() != NULL);
125         NameMap::const_iterator iter = names()->find(reg);
126         if (iter != names()->end()) {
127                 return iter->second;
128         }
129         return std::string("<INVALID_REG>");
130 }
131
132 unsigned int MachRegister::size() const {
133    switch (getArchitecture())
134    {
135       case Arch_x86:
136          switch (reg & 0x0000ff00) {
137             case x86::L_REG: //L_REG
138             case x86::H_REG: //H_REG
139                return 1;
140             case x86::W_REG: //W_REG
141                return 2;
142             case x86::FULL: //FULL
143                return 4;
144             case x86::QUAD:
145                return 8;
146             case x86::OCT:
147                return 16;
148             case x86::FPDBL:
149                return 10;
150             case x86::BIT:
151                return 0;
152             default:
153                return 0;//KEVINTODO: removed sanity-check assert because of asprotect fuzz testing, could use this as a sign that the parse has gone into junk
154                assert(0);
155          }
156       case Arch_x86_64:
157          switch (reg & 0x0000ff00) {
158             case x86_64::L_REG: //L_REG
159             case x86_64::H_REG: //H_REG
160                 return 1;
161             case x86_64::W_REG: //W_REG
162                 return 2;
163             case x86_64::FULL: //FULL
164                 return 8;
165             case x86_64::D_REG:
166                return 4;
167             case x86_64::OCT:
168                return 16;
169             case x86_64::FPDBL:
170                return 10;
171             case x86_64::BIT:
172                return 0;
173             default:
174                return 0; // Xiaozhu: do not assert, but return 0 as an indication of parsing junk.
175                assert(0);
176          }
177       case Arch_ppc32: {
178          int reg_class = reg & 0x00ff0000;
179          if (reg_class == ppc32::FPR || reg_class == ppc32::FSR)
180             return 8;
181          return 4;
182       }
183       case Arch_ppc64:
184         if((reg & 0x00ff0000) == aarch64::FPR)
185           return 16;
186         return 8;
187       case Arch_aarch32:
188         assert(0);
189       case Arch_aarch64:
190                 if((reg & 0x00ff0000) == aarch64::FPR)
191                 {
192                     switch(reg & 0x0000ff00)
193                     {
194                         case aarch64::B_REG: return 1;
195                         case aarch64::W_REG: return 2;
196                         case aarch64::D_REG: return 4;
197                         case aarch64::FULL: 
198                         case aarch64::HQ_REG: return 8;
199                         case aarch64::Q_REG: return 16;
200                         default:
201                             assert(0);
202                             return 0;
203                     }
204                 }
205                 else if((reg & 0x00ff0000) == aarch64::GPR || (reg & 0x00ff0000) == aarch64::SPR ||
206                 (reg & 0x00ff0000) == aarch64::SYSREG || (reg & 0x00ff0000) == aarch64::FLAG)
207                         switch(reg & 0x0000ff00)
208                         {
209                                 case aarch64::FULL : return 8;
210                                 case aarch64::D_REG: return 4;
211                 case aarch64::BIT:   return 0;
212                                 default: return 0;
213                         }
214                 else
215                         return 4;
216       case Arch_none:
217          return 0;
218    }
219    return 0; //Unreachable, but disable warnings
220 }
221
222 bool MachRegister::operator<(const MachRegister &a) const {
223    return (reg < a.reg);
224 }
225
226 bool MachRegister::operator==(const MachRegister &a) const {
227    return (reg == a.reg);
228 }
229
230 MachRegister::operator signed int() const {
231    return reg;
232 }
233
234 signed int MachRegister::val() const {
235    return reg;
236 }
237
238
239 MachRegister MachRegister::getPC(Dyninst::Architecture arch)
240 {
241    switch (arch)
242    {
243       case Arch_x86:
244          return x86::eip;
245       case Arch_x86_64:
246          return x86_64::rip;
247       case Arch_ppc32:
248          return ppc32::pc;
249       case Arch_ppc64:
250          return ppc64::pc;
251       case Arch_aarch64:  //aarch64: pc is not writable
252          return aarch64::pc;
253       case Arch_aarch32:
254          assert(0);
255       case Arch_none:
256          return InvalidReg;
257    }
258    return InvalidReg;
259 }
260
261
262 MachRegister MachRegister::getReturnAddress(Dyninst::Architecture arch)
263 {
264    switch (arch)
265    {
266       case Arch_x86:
267           assert(0); //not implemented
268       case Arch_x86_64:
269           assert(0); //not implemented
270       case Arch_ppc32:
271           assert(0); //not implemented
272       case Arch_ppc64:
273           assert(0); //not implemented
274       case Arch_aarch64:  //aarch64: x30 stores the RA for current frame
275          return aarch64::x30;
276       case Arch_aarch32:
277          assert(0);
278       case Arch_none:
279          return InvalidReg;
280    }
281    return InvalidReg;
282 }
283
284 MachRegister MachRegister::getFramePointer(Dyninst::Architecture arch)
285 {
286    switch (arch)
287    {
288       case Arch_x86:
289          return x86::ebp;
290       case Arch_x86_64:
291          return x86_64::rbp;
292       case Arch_ppc32:
293          return ppc32::r1;
294       case Arch_ppc64:
295          return ppc64::r1;
296       case Arch_aarch64:
297          return aarch64::x29; //aarch64: frame pointer is X29 by convention
298       case Arch_none:
299          return InvalidReg;
300       default:
301          assert(0);
302          return InvalidReg;
303    }
304    return InvalidReg;
305 }
306
307 MachRegister MachRegister::getStackPointer(Dyninst::Architecture arch)
308 {
309    switch (arch)
310    {
311       case Arch_x86:
312          return x86::esp;
313       case Arch_x86_64:
314          return x86_64::rsp;
315       case Arch_ppc32:
316          return ppc32::r1;
317       case Arch_ppc64:
318          return ppc64::r1;
319       case Arch_aarch64:
320          return aarch64::sp; //aarch64: stack pointer is an independent register
321       case Arch_aarch32:
322          assert(0);
323       case Arch_none:
324          return InvalidReg;
325       default:
326          assert(0);
327          return InvalidReg;
328    }
329    return InvalidReg;
330 }
331
332 MachRegister MachRegister::getSyscallNumberReg(Dyninst::Architecture arch)
333 {
334     switch (arch)
335     {
336         case Arch_x86:
337             return x86::eax;
338         case Arch_x86_64:
339             return x86_64::rax;
340         case Arch_ppc32:
341             return ppc32::r0;
342         case Arch_ppc64:
343             return ppc64::r0;
344         case Arch_aarch64:
345             return aarch64::x8;
346         case Arch_aarch32:
347             assert(0);
348         case Arch_none:
349             return InvalidReg;
350       default:
351          assert(0);
352          return InvalidReg;
353     }
354     return InvalidReg;
355 }
356
357 MachRegister MachRegister::getSyscallNumberOReg(Dyninst::Architecture arch)
358 {
359     switch (arch)
360     {
361         case Arch_x86:
362             return x86::oeax;
363         case Arch_x86_64:
364             return x86_64::orax;
365         case Arch_ppc32:
366             return ppc32::r0;
367         case Arch_ppc64:
368             return ppc64::r0;
369         case Arch_aarch64:
370             return aarch64::x8;
371         case Arch_none:
372             return InvalidReg;
373       default:
374          assert(0);
375          return InvalidReg;
376     }
377     return InvalidReg;
378 }
379
380 MachRegister MachRegister::getSyscallReturnValueReg(Dyninst::Architecture arch)
381 {
382     switch (arch)
383     {
384         case Arch_x86:
385             return x86::eax;
386         case Arch_x86_64:
387             return x86_64::rax;
388         case Arch_ppc32:
389             return ppc32::r3;
390         case Arch_ppc64:
391             return ppc64::r3;
392         case Arch_aarch64:
393             return aarch64::x0; //returned value is save in x0
394         case Arch_none:
395             return InvalidReg;
396       default:
397          assert(0);
398          return InvalidReg;
399     }
400     return InvalidReg;
401 }
402
403 MachRegister MachRegister::getArchRegFromAbstractReg(MachRegister abstract,
404         Dyninst::Architecture arch) {
405     switch(arch){
406         case Arch_aarch64:
407             if( abstract == ReturnAddr)
408                     return aarch64::x30;
409             if( abstract == FrameBase)
410                     return aarch64::x29;
411             if( abstract == StackTop)
412                     return aarch64::sp;
413             if( abstract == CFA)
414                 assert(0); //don't know what to do
415             //not abstract, return arch reg
416             return abstract;
417         default:
418             assert(0);
419     }
420     return Dyninst::InvalidReg;
421 }
422
423 MachRegister MachRegister::getZeroFlag(Dyninst::Architecture arch)
424 {
425    switch (arch)
426    {
427       case Arch_x86:
428          return x86::zf;
429       case Arch_x86_64:
430          return x86_64::zf;
431       case Arch_aarch64: 
432          return aarch64::z;
433       case Arch_aarch32:
434          assert(0);
435       case Arch_none:
436          return InvalidReg;
437    }
438    return InvalidReg;
439 }
440
441
442 bool MachRegister::isPC() const
443 {
444    return (*this == x86_64::rip || *this == x86::eip ||
445            *this == ppc32::pc || *this == ppc64::pc ||
446            *this == aarch64::pc );
447 }
448
449 bool MachRegister::isFramePointer() const
450 {
451    return (*this == x86_64::rbp || *this == x86::ebp ||
452            *this == FrameBase ||
453            *this == aarch64::x29);
454 }
455
456 bool MachRegister::isStackPointer() const
457 {
458    return (*this == x86_64::rsp || *this == x86::esp ||
459            *this == ppc32::r1   || *this == ppc64::r1 ||
460            *this == aarch64::sp);
461 }
462
463 bool MachRegister::isSyscallNumberReg() const
464 {
465    return ( *this == x86_64::orax || *this == x86::oeax ||
466             *this == ppc32::r1    || *this == ppc64::r1 ||
467             *this == aarch64::x8
468             );
469 }
470
471 bool MachRegister::isSyscallReturnValueReg() const
472 {
473    if(getArchitecture() == Arch_aarch64)
474       assert(0);
475     return (*this == x86_64::rax || *this == x86::eax ||
476             *this == ppc32::r1   || *this == ppc64::r1 ||
477             *this == aarch64::x0
478             );
479 }
480
481 COMMON_EXPORT bool Dyninst::isSegmentRegister(int regClass)
482 {
483    return 0 != (regClass & x86::SEG);
484 }
485
486 void MachRegister::getROSERegister(int &c, int &n, int &p)
487 {
488    // Rose: class, number, position
489    // Dyninst: category, base id, subrange
490
491    signed int category = (reg & 0x00ff0000);
492    signed int subrange = (reg & 0x0000ff00);
493    signed int baseID =   (reg & 0x000000ff);
494
495    switch (getArchitecture()) {
496       case Arch_x86:
497          switch (category) {
498             case x86::GPR:
499                c = x86_regclass_gpr;
500                switch (baseID) {
501                   case x86::BASEA:
502                      n = x86_gpr_ax;
503                      break;
504                   case x86::BASEC:
505                      n = x86_gpr_cx;
506                      break;
507                   case x86::BASED:
508                      n = x86_gpr_dx;
509                      break;
510                   case x86::BASEB:
511                      n = x86_gpr_bx;
512                      break;
513                   case x86::BASESP:
514                      n = x86_gpr_sp;
515                      break;
516                   case x86::BASEBP:
517                      n = x86_gpr_bp;
518                      break;
519                   case x86::BASESI:
520                      n = x86_gpr_si;
521                      break;
522                   case x86::BASEDI:
523                      n = x86_gpr_di;
524                      break;
525                   default:
526                      n = 0;
527                      break;
528                }
529                break;
530             case x86::SEG:
531                c = x86_regclass_segment;
532                switch (baseID) {
533                   case 0x0:
534                      n = x86_segreg_ds;
535                      break;
536                   case 0x1:
537                      n = x86_segreg_es;
538                      break;
539                   case 0x2:
540                      n = x86_segreg_fs;
541                      break;
542                   case 0x3:
543                      n = x86_segreg_gs;
544                      break;
545                   case 0x4:
546                      n = x86_segreg_cs;
547                      break;
548                   case 0x5:
549                      n = x86_segreg_ss;
550                      break;
551                   default:
552                      n = 0;
553                      break;
554                }
555                break;
556             case x86::FLAG:
557                c = x86_regclass_flags;
558                switch(baseID) {
559                  case x86::CF:
560                          n = x86_flag_cf;
561                          break;
562                  case x86::PF:
563                          n = x86_flag_pf;
564                          break;
565                  case x86::AF:
566                          n = x86_flag_af;
567                          break;
568                  case x86::ZF:
569                          n = x86_flag_zf;
570                          break;
571                  case x86::SF:
572                          n = x86_flag_sf;
573                          break;
574                  case x86::TF:
575                          n = x86_flag_tf;
576                          break;
577                  case x86::IF:
578                          n = x86_flag_if;
579                          break;
580                  case x86::DF:
581                          n = x86_flag_df;
582                          break;
583                  case x86::OF:
584                          n = x86_flag_of;
585                          break;
586                  default:
587                          assert(0);
588                          break;
589                  }
590          break;
591          case x86::MISC:
592                c = x86_regclass_unknown;
593                break;
594          case x86::XMM:
595             c = x86_regclass_xmm;
596             n = baseID;
597             break;
598          case x86::MMX:
599             c = x86_regclass_mm;
600             n = baseID;
601             break;
602          case x86::CTL:
603             c = x86_regclass_cr;
604             n = baseID;
605             break;
606          case x86::DBG:
607             c = x86_regclass_dr;
608             n = baseID;
609             break;
610          case x86::TST:
611             c = x86_regclass_unknown;
612             break;
613          case 0:
614            switch (baseID) {
615               case 0x10:
616                  c = x86_regclass_ip;
617                  n = 0;
618                  break;
619               default:
620                  c = x86_regclass_unknown;
621                  break;
622            }
623          break;
624          }
625       break;
626     case Arch_x86_64:
627          switch (category) {
628             case x86_64::GPR:
629                c = x86_regclass_gpr;
630                switch (baseID) {
631                   case x86_64::BASEA:
632                      n = x86_gpr_ax;
633                      break;
634                   case x86_64::BASEC:
635                      n = x86_gpr_cx;
636                      break;
637                   case x86_64::BASED:
638                      n = x86_gpr_dx;
639                      break;
640                   case x86_64::BASEB:
641                      n = x86_gpr_bx;
642                      break;
643                   case x86_64::BASESP:
644                      n = x86_gpr_sp;
645                      break;
646                   case x86_64::BASEBP:
647                      n = x86_gpr_bp;
648                      break;
649                   case x86_64::BASESI:
650                      n = x86_gpr_si;
651                      break;
652                   case x86_64::BASEDI:
653                      n = x86_gpr_di;
654                      break;
655                   case x86_64::BASE8:
656                      n = x86_gpr_r8;
657                      break;
658                   case x86_64::BASE9:
659                      n = x86_gpr_r9;
660                      break;
661                   case x86_64::BASE10:
662                      n = x86_gpr_r10;
663                      break;
664                   case x86_64::BASE11:
665                      n = x86_gpr_r11;
666                      break;
667                   case x86_64::BASE12:
668                      n = x86_gpr_r12;
669                      break;
670                   case x86_64::BASE13:
671                      n = x86_gpr_r13;
672                      break;
673                   case x86_64::BASE14:
674                      n = x86_gpr_r14;
675                      break;
676                   case x86_64::BASE15:
677                      n = x86_gpr_r15;
678                      break;
679                   default:
680                      n = 0;
681                      break;
682                }
683                break;
684             case x86_64::SEG:
685                c = x86_regclass_segment;
686                switch (baseID) {
687                   case 0x0:
688                      n = x86_segreg_ds;
689                      break;
690                   case 0x1:
691                      n = x86_segreg_es;
692                      break;
693                   case 0x2:
694                      n = x86_segreg_fs;
695                      break;
696                   case 0x3:
697                      n = x86_segreg_gs;
698                      break;
699                   case 0x4:
700                      n = x86_segreg_cs;
701                      break;
702                   case 0x5:
703                      n = x86_segreg_ss;
704                      break;
705                   default:
706                      n = 0;
707                      break;
708                }
709                break;
710             case x86_64::FLAG:
711                c = x86_regclass_flags;
712                switch(baseID) {
713                case x86_64::CF:
714                  n = x86_flag_cf;
715                  break;
716                case x86_64::PF:
717                  n = x86_flag_pf;
718                  break;
719                case x86_64::AF:
720                  n = x86_flag_af;
721                  break;
722                case x86_64::ZF:
723                  n = x86_flag_zf;
724                  break;
725                case x86_64::SF:
726                  n = x86_flag_sf;
727                  break;
728                case x86_64::TF:
729                  n = x86_flag_tf;
730                  break;
731                case x86_64::IF:
732                  n = x86_flag_if;
733                  break;
734                case x86_64::DF:
735                  n = x86_flag_df;
736                  break;
737                case x86_64::OF:
738                  n = x86_flag_of;
739                  break;
740                default:
741                  assert(0);
742                  break;
743       }
744                break;
745             case x86_64::MISC:
746                c = x86_regclass_unknown;
747                break;
748             case x86_64::KMASK:
749                c = x86_regclass_kmask;
750                n = baseID;
751                break;
752             case x86_64::ZMM:
753                c = x86_regclass_zmm;
754                n = baseID;
755                break;
756             case x86_64::YMM:
757                c = x86_regclass_ymm;
758                n = baseID;
759                break;
760             case x86_64::XMM:
761                c = x86_regclass_xmm;
762                n = baseID;
763                break;
764             case x86_64::MMX:
765                c = x86_regclass_mm;
766                n = baseID;
767                break;
768             case x86_64::CTL:
769                c = x86_regclass_cr;
770                n = baseID;
771                break;
772             case x86_64::DBG:
773                c = x86_regclass_dr;
774                n = baseID;
775                break;
776             case x86_64::TST:
777                c = x86_regclass_unknown;
778                break;
779             case 0:
780                switch (baseID) {
781                   case 0x10:
782                      c = x86_regclass_ip;
783                      n = 0;
784                      break;
785                   default:
786                      c = x86_regclass_unknown;
787                      break;
788                }
789                break;
790          }
791          break;
792        case Arch_ppc32:
793        case Arch_ppc64: // 64-bit not supported in ROSE
794        {
795          baseID = reg & 0x0000FFFF;
796            n = baseID;
797            switch(category)
798            {
799                case ppc32::GPR:
800                    c = powerpc_regclass_gpr;
801                    break;
802                case ppc32::FPR:
803                case ppc32::FSR:
804                    c = powerpc_regclass_fpr;
805                    break;
806                case ppc32::SPR:
807                {
808                    if(baseID < 613) {
809                        c = powerpc_regclass_spr;
810                    } else if(baseID < 621 ) {
811                        c = powerpc_regclass_sr;
812                    } else {
813                        c = powerpc_regclass_cr;
814                        n = baseID - 621;
815                        if(n > 7) {
816                          n = 0;
817                          p = powerpc_condreggranularity_whole;
818                        } else {
819                          p = powerpc_condreggranularity_field;
820                        }
821
822                    }
823                }
824                break;
825                default:
826                    assert(!"unknown register type!");
827                    break;
828            }
829            return;
830        }
831        break;
832        case Arch_aarch64: {
833            p = 0;
834            switch (category) {
835                case aarch64::GPR: {
836                    c = armv8_regclass_gpr;
837                    if (baseID == (aarch64::zr & 0xFF) || baseID == (aarch64::wzr & 0xFF))
838                        n = armv8_gpr_zr;
839                    else {
840                        int regnum = baseID - (aarch64::x0 & 0xFF);
841                        n = armv8_gpr_r0 + regnum;
842                    }
843                }
844                    break;
845                case aarch64::SPR: {
846                    n = 0;
847                    if (baseID == (aarch64::pstate & 0xFF)) {
848                        c = armv8_regclass_pstate;
849                    } else if (baseID == (aarch64::pc & 0xFF)) {
850                        c = armv8_regclass_pc;
851                    } else if (baseID == (aarch64::sp & 0xFF) || baseID == (aarch64::wsp & 0xFF)) {
852                        c = armv8_regclass_sp;
853                    }
854                }
855                    break;
856                case aarch64::FLAG: {
857                    c = armv8_regclass_pstate;
858                    n = 0;
859                    switch (baseID) {
860                        case aarch64::N_FLAG:
861                            p = armv8_pstatefield_n;
862                            break;
863                        case aarch64::Z_FLAG:
864                            p = armv8_pstatefield_z;
865                            break;
866                        case aarch64::V_FLAG:
867                            p = armv8_pstatefield_v;
868                            break;
869                        case aarch64::C_FLAG:
870                            p = armv8_pstatefield_c;
871                            break;
872                        default:
873                            assert(!"unknown flag type!");
874                            break;
875                    }
876                }
877                    break;
878                default:
879                    assert(!"unknown register type!");
880                    break;
881            }
882            return;
883        }
884       break;
885       default:
886          c = x86_regclass_unknown;
887          n = 0;
888          break;
889    }
890
891    switch (getArchitecture()) {
892       case Arch_x86:
893          switch (subrange) {
894             case x86::OCT:
895             case x86::FPDBL:
896                p = x86_regpos_qword;
897                break;
898             case x86::H_REG:
899                p = x86_regpos_high_byte;
900                break;
901             case x86::L_REG:
902                p = x86_regpos_low_byte;
903                break;
904             case x86::W_REG:
905                p = x86_regpos_word;
906                break;
907             case x86::FULL:
908             case x86_64::D_REG:
909                p = x86_regpos_dword;
910                break;
911             case x86::BIT:
912                p = x86_regpos_all;
913                break;
914          }
915          break;
916
917       case Arch_x86_64:
918          switch (subrange) {
919             case x86::FULL:
920             case x86::OCT:
921             case x86::FPDBL:
922                p = x86_regpos_qword;
923                break;
924             case x86::H_REG:
925                p = x86_regpos_high_byte;
926                break;
927             case x86::L_REG:
928                p = x86_regpos_low_byte;
929                break;
930             case x86::W_REG:
931                p = x86_regpos_word;
932                break;
933             case x86_64::D_REG:
934                p = x86_regpos_dword;
935                break;
936                  case x86::BIT:
937                  p = x86_regpos_all;
938                  break;
939          }
940       break;
941       case Arch_aarch64:
942       {
943           assert(0);
944         }
945       default:
946         p = x86_regpos_unknown;
947    }
948 }
949
950 MachRegister MachRegister::DwarfEncToReg(int encoding, Dyninst::Architecture arch)
951 {
952    switch (arch)
953    {
954       case Arch_x86:
955          switch (encoding) {
956             case 0: return Dyninst::x86::eax;
957             case 1: return Dyninst::x86::ecx;
958             case 2: return Dyninst::x86::edx;
959             case 3: return Dyninst::x86::ebx;
960             case 4: return Dyninst::x86::esp;
961             case 5: return Dyninst::x86::ebp;
962             case 6: return Dyninst::x86::esi;
963             case 7: return Dyninst::x86::edi;
964             case 8: return Dyninst::x86::eip;
965             case 9: return Dyninst::x86::flags;
966             case 10: return Dyninst::InvalidReg;
967             case 11: return Dyninst::x86::st0;
968             case 12: return Dyninst::x86::st1;
969             case 13: return Dyninst::x86::st2;
970             case 14: return Dyninst::x86::st3;
971             case 15: return Dyninst::x86::st4;
972             case 16: return Dyninst::x86::st5;
973             case 17: return Dyninst::x86::st6;
974             case 18: return Dyninst::x86::st7;
975             case 19: return Dyninst::InvalidReg;
976             case 20: return Dyninst::InvalidReg;
977             case 21: return Dyninst::x86::xmm0;
978             case 22: return Dyninst::x86::xmm1;
979             case 23: return Dyninst::x86::xmm2;
980             case 24: return Dyninst::x86::xmm3;
981             case 25: return Dyninst::x86::xmm4;
982             case 26: return Dyninst::x86::xmm5;
983             case 27: return Dyninst::x86::xmm6;
984             case 28: return Dyninst::x86::xmm7;
985             case 29: return Dyninst::x86::mm0;
986             case 30: return Dyninst::x86::mm1;
987             case 31: return Dyninst::x86::mm2;
988             case 32: return Dyninst::x86::mm3;
989             case 33: return Dyninst::x86::mm4;
990             case 34: return Dyninst::x86::mm5;
991             case 35: return Dyninst::x86::mm6;
992             case 36: return Dyninst::x86::mm7;
993             case 37: return Dyninst::InvalidReg; //fcw
994             case 38: return Dyninst::InvalidReg; //fsw
995             case 39: return Dyninst::InvalidReg; //mxcsr
996             case 40: return Dyninst::x86::es;
997             case 41: return Dyninst::x86::cs;
998             case 42: return Dyninst::x86::ss;
999             case 43: return Dyninst::x86::ds;
1000             case 44: return Dyninst::x86::fs;
1001             case 45: return Dyninst::x86::gs;
1002             case 46: return Dyninst::InvalidReg;
1003             case 47: return Dyninst::InvalidReg;
1004             case 48: return Dyninst::InvalidReg; //tr
1005             case 49: return Dyninst::InvalidReg; //ldtr
1006             default: return Dyninst::InvalidReg;
1007          }
1008          break;
1009       case Arch_x86_64:
1010          switch (encoding) {
1011             case 0: return Dyninst::x86_64::rax;
1012             case 1: return Dyninst::x86_64::rdx;
1013             case 2: return Dyninst::x86_64::rcx;
1014             case 3: return Dyninst::x86_64::rbx;
1015             case 4: return Dyninst::x86_64::rsi;
1016             case 5: return Dyninst::x86_64::rdi;
1017             case 6: return Dyninst::x86_64::rbp;
1018             case 7: return Dyninst::x86_64::rsp;
1019             case 8: return Dyninst::x86_64::r8;
1020             case 9: return Dyninst::x86_64::r9;
1021             case 10: return Dyninst::x86_64::r10;
1022             case 11: return Dyninst::x86_64::r11;
1023             case 12: return Dyninst::x86_64::r12;
1024             case 13: return Dyninst::x86_64::r13;
1025             case 14: return Dyninst::x86_64::r14;
1026             case 15: return Dyninst::x86_64::r15;
1027             case 16: return Dyninst::x86_64::rip;
1028             case 17: return Dyninst::x86_64::k0;
1029             case 18: return Dyninst::x86_64::k1;
1030             case 19: return Dyninst::x86_64::k2;
1031             case 20: return Dyninst::x86_64::k3;
1032             case 21: return Dyninst::x86_64::k4;
1033             case 22: return Dyninst::x86_64::k5;
1034             case 23: return Dyninst::x86_64::k6;
1035             case 24: return Dyninst::x86_64::k7;
1036             case 25: return Dyninst::x86_64::zmm0;
1037             case 26: return Dyninst::x86_64::zmm1;
1038             case 27: return Dyninst::x86_64::zmm2;
1039             case 28: return Dyninst::x86_64::zmm3;
1040             case 29: return Dyninst::x86_64::zmm4;
1041             case 30: return Dyninst::x86_64::zmm5;
1042             case 31: return Dyninst::x86_64::zmm6;
1043             case 32: return Dyninst::x86_64::zmm7;
1044             case 33: return Dyninst::x86_64::zmm8;
1045             case 34: return Dyninst::x86_64::zmm9;
1046             case 35: return Dyninst::x86_64::zmm10;
1047             case 36: return Dyninst::x86_64::zmm11;
1048             case 37: return Dyninst::x86_64::zmm12;
1049             case 38: return Dyninst::x86_64::zmm13;
1050             case 39: return Dyninst::x86_64::zmm14;
1051             case 40: return Dyninst::x86_64::zmm15;
1052             case 41: return Dyninst::x86_64::zmm16;
1053             case 42: return Dyninst::x86_64::zmm17;
1054             case 43: return Dyninst::x86_64::zmm18;
1055             case 44: return Dyninst::x86_64::zmm19;
1056             case 45: return Dyninst::x86_64::zmm20;
1057             case 46: return Dyninst::x86_64::zmm21;
1058             case 47: return Dyninst::x86_64::zmm22;
1059             case 48: return Dyninst::x86_64::zmm23;
1060             case 49: return Dyninst::x86_64::zmm24;
1061             case 50: return Dyninst::x86_64::zmm25;
1062             case 51: return Dyninst::x86_64::zmm26;
1063             case 52: return Dyninst::x86_64::zmm27;
1064             case 53: return Dyninst::x86_64::zmm28;
1065             case 54: return Dyninst::x86_64::zmm29;
1066             case 55: return Dyninst::x86_64::zmm30;
1067             case 56: return Dyninst::x86_64::zmm31;
1068             case 57: return Dyninst::x86_64::ymm0;
1069             case 58: return Dyninst::x86_64::ymm1;
1070             case 59: return Dyninst::x86_64::ymm2;
1071             case 60: return Dyninst::x86_64::ymm3;
1072             case 61: return Dyninst::x86_64::ymm4;
1073             case 62: return Dyninst::x86_64::ymm5;
1074             case 63: return Dyninst::x86_64::ymm6;
1075             case 64: return Dyninst::x86_64::ymm7;
1076             case 65: return Dyninst::x86_64::ymm8;
1077             case 66: return Dyninst::x86_64::ymm9;
1078             case 67: return Dyninst::x86_64::ymm10;
1079             case 68: return Dyninst::x86_64::ymm11;
1080             case 69: return Dyninst::x86_64::ymm12;
1081             case 70: return Dyninst::x86_64::ymm13;
1082             case 71: return Dyninst::x86_64::ymm14;
1083             case 72: return Dyninst::x86_64::ymm15;
1084             case 73: return Dyninst::x86_64::ymm16;
1085             case 74: return Dyninst::x86_64::ymm17;
1086             case 75: return Dyninst::x86_64::ymm18;
1087             case 76: return Dyninst::x86_64::ymm19;
1088             case 77: return Dyninst::x86_64::ymm20;
1089             case 78: return Dyninst::x86_64::ymm21;
1090             case 79: return Dyninst::x86_64::ymm22;
1091             case 80: return Dyninst::x86_64::ymm23;
1092             case 81: return Dyninst::x86_64::ymm24;
1093             case 82: return Dyninst::x86_64::ymm25;
1094             case 83: return Dyninst::x86_64::ymm26;
1095             case 84: return Dyninst::x86_64::ymm27;
1096             case 85: return Dyninst::x86_64::ymm28;
1097             case 86: return Dyninst::x86_64::ymm29;
1098             case 87: return Dyninst::x86_64::ymm30;
1099             case 88: return Dyninst::x86_64::ymm31;
1100             case 89: return Dyninst::x86_64::xmm0;
1101             case 90: return Dyninst::x86_64::xmm1;
1102             case 91: return Dyninst::x86_64::xmm2;
1103             case 92: return Dyninst::x86_64::xmm3;
1104             case 93: return Dyninst::x86_64::xmm4;
1105             case 94: return Dyninst::x86_64::xmm5;
1106             case 95: return Dyninst::x86_64::xmm6;
1107             case 96: return Dyninst::x86_64::xmm7;
1108             case 97: return Dyninst::x86_64::xmm8;
1109             case 98: return Dyninst::x86_64::xmm9;
1110             case 99: return Dyninst::x86_64::xmm10;
1111             case 100: return Dyninst::x86_64::xmm11;
1112             case 101: return Dyninst::x86_64::xmm12;
1113             case 102: return Dyninst::x86_64::xmm13;
1114             case 103: return Dyninst::x86_64::xmm14;
1115             case 104: return Dyninst::x86_64::xmm15;
1116             case 105: return Dyninst::x86_64::xmm16;
1117             case 106: return Dyninst::x86_64::xmm17;
1118             case 107: return Dyninst::x86_64::xmm18;
1119             case 108: return Dyninst::x86_64::xmm19;
1120             case 109: return Dyninst::x86_64::xmm20;
1121             case 110: return Dyninst::x86_64::xmm21;
1122             case 111: return Dyninst::x86_64::xmm22;
1123             case 112: return Dyninst::x86_64::xmm23;
1124             case 113: return Dyninst::x86_64::xmm24;
1125             case 114: return Dyninst::x86_64::xmm25;
1126             case 115: return Dyninst::x86_64::xmm26;
1127             case 116: return Dyninst::x86_64::xmm27;
1128             case 117: return Dyninst::x86_64::xmm28;
1129             case 118: return Dyninst::x86_64::xmm29;
1130             case 119: return Dyninst::x86_64::xmm30;
1131             case 120: return Dyninst::x86_64::xmm31;
1132             case 121: return Dyninst::x86_64::st0;
1133             case 122: return Dyninst::x86_64::st1;
1134             case 123: return Dyninst::x86_64::st2;
1135             case 124: return Dyninst::x86_64::st3;
1136             case 125: return Dyninst::x86_64::st4;
1137             case 126: return Dyninst::x86_64::st5;
1138             case 127: return Dyninst::x86_64::st6;
1139             case 128: return Dyninst::x86_64::st7;
1140             case 129: return Dyninst::x86_64::mm0;
1141             case 130: return Dyninst::x86_64::mm1;
1142             case 131: return Dyninst::x86_64::mm2;
1143             case 132: return Dyninst::x86_64::mm3;
1144             case 133: return Dyninst::x86_64::mm4;
1145             case 134: return Dyninst::x86_64::mm5;
1146             case 135: return Dyninst::x86_64::mm6;
1147             case 136: return Dyninst::x86_64::mm7;
1148             case 137: return Dyninst::x86_64::flags;
1149             case 138: return Dyninst::x86_64::es;
1150             case 139: return Dyninst::x86_64::cs;
1151             case 140: return Dyninst::x86_64::ss;
1152             case 141: return Dyninst::x86_64::ds;
1153             case 142: return Dyninst::x86_64::fs;
1154             case 143: return Dyninst::x86_64::gs;
1155             case 144: return Dyninst::InvalidReg;
1156             case 145: return Dyninst::InvalidReg;
1157             case 146: return Dyninst::x86_64::fsbase;
1158             case 147: return Dyninst::x86_64::gsbase;
1159             case 148: return Dyninst::InvalidReg;
1160             case 149: return Dyninst::InvalidReg;
1161             case 150: return Dyninst::InvalidReg; //tr
1162             case 151: return Dyninst::InvalidReg; //ldtr
1163             case 152: return Dyninst::InvalidReg; //mxcsr
1164             case 153: return Dyninst::InvalidReg; //fcw
1165             case 154: return Dyninst::InvalidReg; //fsw
1166          }
1167          break;
1168       case Arch_ppc32:
1169          switch (encoding) {
1170             case 0: return Dyninst::ppc32::r0;
1171             case 1: return Dyninst::ppc32::r1;
1172             case 2: return Dyninst::ppc32::r2;
1173             case 3: return Dyninst::ppc32::r3;
1174             case 4: return Dyninst::ppc32::r4;
1175             case 5: return Dyninst::ppc32::r5;
1176             case 6: return Dyninst::ppc32::r6;
1177             case 7: return Dyninst::ppc32::r7;
1178             case 8: return Dyninst::ppc32::r8;
1179             case 9: return Dyninst::ppc32::r9;
1180             case 10: return Dyninst::ppc32::r10;
1181             case 11: return Dyninst::ppc32::r11;
1182             case 12: return Dyninst::ppc32::r12;
1183             case 13: return Dyninst::ppc32::r13;
1184             case 14: return Dyninst::ppc32::r14;
1185             case 15: return Dyninst::ppc32::r15;
1186             case 16: return Dyninst::ppc32::r16;
1187             case 17: return Dyninst::ppc32::r17;
1188             case 18: return Dyninst::ppc32::r18;
1189             case 19: return Dyninst::ppc32::r19;
1190             case 20: return Dyninst::ppc32::r20;
1191             case 21: return Dyninst::ppc32::r21;
1192             case 22: return Dyninst::ppc32::r22;
1193             case 23: return Dyninst::ppc32::r23;
1194             case 24: return Dyninst::ppc32::r24;
1195             case 25: return Dyninst::ppc32::r25;
1196             case 26: return Dyninst::ppc32::r26;
1197             case 27: return Dyninst::ppc32::r27;
1198             case 28: return Dyninst::ppc32::r28;
1199             case 29: return Dyninst::ppc32::r29;
1200             case 30: return Dyninst::ppc32::r30;
1201             case 31: return Dyninst::ppc32::r31;
1202             case 32: return Dyninst::ppc32::fpr0;
1203             case 33: return Dyninst::ppc32::fpr1;
1204             case 34: return Dyninst::ppc32::fpr2;
1205             case 35: return Dyninst::ppc32::fpr3;
1206             case 36: return Dyninst::ppc32::fpr4;
1207             case 37: return Dyninst::ppc32::fpr5;
1208             case 38: return Dyninst::ppc32::fpr6;
1209             case 39: return Dyninst::ppc32::fpr7;
1210             case 40: return Dyninst::ppc32::fpr8;
1211             case 41: return Dyninst::ppc32::fpr9;
1212             case 42: return Dyninst::ppc32::fpr10;
1213             case 43: return Dyninst::ppc32::fpr11;
1214             case 44: return Dyninst::ppc32::fpr12;
1215             case 45: return Dyninst::ppc32::fpr13;
1216             case 46: return Dyninst::ppc32::fpr14;
1217             case 47: return Dyninst::ppc32::fpr15;
1218             case 48: return Dyninst::ppc32::fpr16;
1219             case 49: return Dyninst::ppc32::fpr17;
1220             case 50: return Dyninst::ppc32::fpr18;
1221             case 51: return Dyninst::ppc32::fpr19;
1222             case 52: return Dyninst::ppc32::fpr20;
1223             case 53: return Dyninst::ppc32::fpr21;
1224             case 54: return Dyninst::ppc32::fpr22;
1225             case 55: return Dyninst::ppc32::fpr23;
1226             case 56: return Dyninst::ppc32::fpr24;
1227             case 57: return Dyninst::ppc32::fpr25;
1228             case 58: return Dyninst::ppc32::fpr26;
1229             case 59: return Dyninst::ppc32::fpr27;
1230             case 60: return Dyninst::ppc32::fpr28;
1231             case 61: return Dyninst::ppc32::fpr29;
1232             case 62: return Dyninst::ppc32::fpr30;
1233             case 63: return Dyninst::ppc32::fpr31;
1234             case 64: return Dyninst::ppc32::cr;
1235             case 65: return Dyninst::InvalidReg; //FPSCR
1236          }
1237          //Seperate switch statements to give compilers an easier time of
1238          // optimizing
1239          switch (encoding) {
1240             case 100: return Dyninst::ppc32::mq;
1241             case 101: return Dyninst::ppc32::xer;
1242             case 102: return Dyninst::InvalidReg;
1243             case 103: return Dyninst::InvalidReg;
1244             case 104: return Dyninst::InvalidReg; //RTCU
1245             case 105: return Dyninst::InvalidReg; //RTCL
1246             case 106: return Dyninst::InvalidReg;
1247             case 107: return Dyninst::InvalidReg;
1248             case 108: return Dyninst::ppc32::lr;
1249             case 109: return Dyninst::ppc32::ctr;
1250             default: return Dyninst::InvalidReg;
1251          }
1252          break;
1253       case Arch_ppc64:
1254          switch (encoding) {
1255             case 0: return Dyninst::ppc64::r0;
1256             case 1: return Dyninst::ppc64::r1;
1257             case 2: return Dyninst::ppc64::r2;
1258             case 3: return Dyninst::ppc64::r3;
1259             case 4: return Dyninst::ppc64::r4;
1260             case 5: return Dyninst::ppc64::r5;
1261             case 6: return Dyninst::ppc64::r6;
1262             case 7: return Dyninst::ppc64::r7;
1263             case 8: return Dyninst::ppc64::r8;
1264             case 9: return Dyninst::ppc64::r9;
1265             case 10: return Dyninst::ppc64::r10;
1266             case 11: return Dyninst::ppc64::r11;
1267             case 12: return Dyninst::ppc64::r12;
1268             case 13: return Dyninst::ppc64::r13;
1269             case 14: return Dyninst::ppc64::r14;
1270             case 15: return Dyninst::ppc64::r15;
1271             case 16: return Dyninst::ppc64::r16;
1272             case 17: return Dyninst::ppc64::r17;
1273             case 18: return Dyninst::ppc64::r18;
1274             case 19: return Dyninst::ppc64::r19;
1275             case 20: return Dyninst::ppc64::r20;
1276             case 21: return Dyninst::ppc64::r21;
1277             case 22: return Dyninst::ppc64::r22;
1278             case 23: return Dyninst::ppc64::r23;
1279             case 24: return Dyninst::ppc64::r24;
1280             case 25: return Dyninst::ppc64::r25;
1281             case 26: return Dyninst::ppc64::r26;
1282             case 27: return Dyninst::ppc64::r27;
1283             case 28: return Dyninst::ppc64::r28;
1284             case 29: return Dyninst::ppc64::r29;
1285             case 30: return Dyninst::ppc64::r30;
1286             case 31: return Dyninst::ppc64::r31;
1287             case 32: return Dyninst::ppc64::fpr0;
1288             case 33: return Dyninst::ppc64::fpr1;
1289             case 34: return Dyninst::ppc64::fpr2;
1290             case 35: return Dyninst::ppc64::fpr3;
1291             case 36: return Dyninst::ppc64::fpr4;
1292             case 37: return Dyninst::ppc64::fpr5;
1293             case 38: return Dyninst::ppc64::fpr6;
1294             case 39: return Dyninst::ppc64::fpr7;
1295             case 40: return Dyninst::ppc64::fpr8;
1296             case 41: return Dyninst::ppc64::fpr9;
1297             case 42: return Dyninst::ppc64::fpr10;
1298             case 43: return Dyninst::ppc64::fpr11;
1299             case 44: return Dyninst::ppc64::fpr12;
1300             case 45: return Dyninst::ppc64::fpr13;
1301             case 46: return Dyninst::ppc64::fpr14;
1302             case 47: return Dyninst::ppc64::fpr15;
1303             case 48: return Dyninst::ppc64::fpr16;
1304             case 49: return Dyninst::ppc64::fpr17;
1305             case 50: return Dyninst::ppc64::fpr18;
1306             case 51: return Dyninst::ppc64::fpr19;
1307             case 52: return Dyninst::ppc64::fpr20;
1308             case 53: return Dyninst::ppc64::fpr21;
1309             case 54: return Dyninst::ppc64::fpr22;
1310             case 55: return Dyninst::ppc64::fpr23;
1311             case 56: return Dyninst::ppc64::fpr24;
1312             case 57: return Dyninst::ppc64::fpr25;
1313             case 58: return Dyninst::ppc64::fpr26;
1314             case 59: return Dyninst::ppc64::fpr27;
1315             case 60: return Dyninst::ppc64::fpr28;
1316             case 61: return Dyninst::ppc64::fpr29;
1317             case 62: return Dyninst::ppc64::fpr30;
1318             case 63: return Dyninst::ppc64::fpr31;
1319             case 64: return Dyninst::ppc64::cr;
1320             case 65: return Dyninst::InvalidReg; //FPSCR
1321          }
1322          //Seperate switch statements to give compilers an easier time of
1323          // optimizing
1324          switch (encoding) {
1325             case 100: return Dyninst::ppc64::mq;
1326             case 101: return Dyninst::ppc64::xer;
1327             case 102: return Dyninst::InvalidReg;
1328             case 103: return Dyninst::InvalidReg;
1329             case 104: return Dyninst::InvalidReg; //RTCU
1330             case 105: return Dyninst::InvalidReg; //RTCL
1331             case 106: return Dyninst::InvalidReg;
1332             case 107: return Dyninst::InvalidReg;
1333             case 108: return Dyninst::ppc64::lr;
1334             case 109: return Dyninst::ppc64::ctr;
1335             default: return Dyninst::InvalidReg;
1336          }
1337          break;
1338       case Arch_aarch64:
1339          {
1340          // this info can be found in
1341          // DWARF for the ARM ® 64-bit Architecture (AArch64)
1342          switch(encoding){
1343             case 0:  return Dyninst::aarch64::x0;
1344             case 1:  return Dyninst::aarch64::x1;
1345             case 2:  return Dyninst::aarch64::x2;
1346             case 3:  return Dyninst::aarch64::x3;
1347             case 4:  return Dyninst::aarch64::x4;
1348             case 5:  return Dyninst::aarch64::x5;
1349             case 6:  return Dyninst::aarch64::x6;
1350             case 7:  return Dyninst::aarch64::x7;
1351             case 8:  return Dyninst::aarch64::x8;
1352             case 9:  return Dyninst::aarch64::x9;
1353             case 10: return Dyninst::aarch64::x10;
1354             case 11: return Dyninst::aarch64::x11;
1355             case 12: return Dyninst::aarch64::x12;
1356             case 13: return Dyninst::aarch64::x13;
1357             case 14: return Dyninst::aarch64::x14;
1358             case 15: return Dyninst::aarch64::x15;
1359             case 16: return Dyninst::aarch64::x16;
1360             case 17: return Dyninst::aarch64::x17;
1361             case 18: return Dyninst::aarch64::x18;
1362             case 19: return Dyninst::aarch64::x19;
1363             case 20: return Dyninst::aarch64::x20;
1364             case 21: return Dyninst::aarch64::x21;
1365             case 22: return Dyninst::aarch64::x22;
1366             case 23: return Dyninst::aarch64::x23;
1367             case 24: return Dyninst::aarch64::x24;
1368             case 25: return Dyninst::aarch64::x25;
1369             case 26: return Dyninst::aarch64::x26;
1370             case 27: return Dyninst::aarch64::x27;
1371             case 28: return Dyninst::aarch64::x28;
1372             case 29: return Dyninst::aarch64::x29;
1373             case 30: return Dyninst::aarch64::x30;
1374             case 31: return Dyninst::aarch64::sp;
1375             case 32: return Dyninst::InvalidReg;
1376          }
1377          switch(encoding){
1378             case 64: return Dyninst::aarch64::q0;
1379             case 65: return Dyninst::aarch64::q1;
1380             case 66: return Dyninst::aarch64::q2;
1381             case 67: return Dyninst::aarch64::q3;
1382             case 68: return Dyninst::aarch64::q4;
1383             case 69: return Dyninst::aarch64::q5;
1384             case 70: return Dyninst::aarch64::q6;
1385             case 71: return Dyninst::aarch64::q7;
1386             case 72: return Dyninst::aarch64::q8;
1387             case 73: return Dyninst::aarch64::q9;
1388             case 74: return Dyninst::aarch64::q10;
1389             case 75: return Dyninst::aarch64::q11;
1390             case 76: return Dyninst::aarch64::q12;
1391             case 77: return Dyninst::aarch64::q13;
1392             case 78: return Dyninst::aarch64::q14;
1393             case 79: return Dyninst::aarch64::q15;
1394             case 80: return Dyninst::aarch64::q16;
1395             case 81: return Dyninst::aarch64::q17;
1396             case 82: return Dyninst::aarch64::q18;
1397             case 83: return Dyninst::aarch64::q19;
1398             case 84: return Dyninst::aarch64::q20;
1399             case 85: return Dyninst::aarch64::q21;
1400             case 86: return Dyninst::aarch64::q22;
1401             case 87: return Dyninst::aarch64::q23;
1402             case 88: return Dyninst::aarch64::q24;
1403             case 89: return Dyninst::aarch64::q25;
1404             case 90: return Dyninst::aarch64::q26;
1405             case 91: return Dyninst::aarch64::q27;
1406             case 92: return Dyninst::aarch64::q28;
1407             case 93: return Dyninst::aarch64::q29;
1408             case 94: return Dyninst::aarch64::q30;
1409             case 95: return Dyninst::aarch64::q31;
1410
1411             default: return Dyninst::InvalidReg;
1412             break;
1413          }
1414          return Dyninst::InvalidReg;
1415          }
1416       case Arch_none:
1417          return Dyninst::InvalidReg;
1418          break;
1419       default:
1420          assert(0);
1421          return InvalidReg;
1422    }
1423    //Invalid Architecture passed
1424    return Dyninst::InvalidReg;
1425
1426 }
1427
1428 int MachRegister::getDwarfEnc() const
1429 {
1430    switch (getArchitecture())
1431    {
1432       case Arch_x86:
1433          switch (val()) {
1434             case Dyninst::x86::ieax: return 0;
1435             case Dyninst::x86::iecx: return 1;
1436             case Dyninst::x86::iedx: return 2;
1437             case Dyninst::x86::iebx: return 3;
1438             case Dyninst::x86::iesp: return 4;
1439             case Dyninst::x86::iebp: return 5;
1440             case Dyninst::x86::iesi: return 6;
1441             case Dyninst::x86::iedi: return 7;
1442             case Dyninst::x86::ieip: return 8;
1443             case Dyninst::x86::iflags: return 9;
1444             case Dyninst::x86::ixmm0: return 21;
1445             case Dyninst::x86::ixmm1: return 22;
1446             case Dyninst::x86::ixmm2: return 23;
1447             case Dyninst::x86::ixmm3: return 24;
1448             case Dyninst::x86::ixmm4: return 25;
1449             case Dyninst::x86::ixmm5: return 26;
1450             case Dyninst::x86::ixmm6: return 27;
1451             case Dyninst::x86::ixmm7: return 28;
1452             case Dyninst::x86::imm0: return 29;
1453             case Dyninst::x86::imm1: return 30;
1454             case Dyninst::x86::imm2: return 31;
1455             case Dyninst::x86::imm3: return 32;
1456             case Dyninst::x86::imm4: return 33;
1457             case Dyninst::x86::imm5: return 34;
1458             case Dyninst::x86::imm6: return 35;
1459             case Dyninst::x86::imm7: return 36;
1460             case Dyninst::x86::ies: return 40;
1461             case Dyninst::x86::ics: return 41;
1462             case Dyninst::x86::iss: return 42;
1463             case Dyninst::x86::ids: return 43;
1464             case Dyninst::x86::ifs: return 44;
1465             case Dyninst::x86::igs: return 45;
1466             default: return -1;
1467          }
1468          break;
1469       case Arch_x86_64:
1470          switch (val()) {
1471             case Dyninst::x86_64::irax: return 0;
1472             case Dyninst::x86_64::irdx: return 1;
1473             case Dyninst::x86_64::ircx: return 2;
1474             case Dyninst::x86_64::irbx: return 3;
1475             case Dyninst::x86_64::irsi: return 4;
1476             case Dyninst::x86_64::irdi: return 5;
1477             case Dyninst::x86_64::irbp: return 6;
1478             case Dyninst::x86_64::irsp: return 7;
1479             case Dyninst::x86_64::ir8: return 8;
1480             case Dyninst::x86_64::ir9: return 9;
1481             case Dyninst::x86_64::ir10: return 10;
1482             case Dyninst::x86_64::ir11: return 11;
1483             case Dyninst::x86_64::ir12: return 12;
1484             case Dyninst::x86_64::ir13: return 13;
1485             case Dyninst::x86_64::ir14: return 14;
1486             case Dyninst::x86_64::ir15: return 15;
1487             case Dyninst::x86_64::irip: return 16;
1488             case Dyninst::x86_64::ik0: return 17;
1489             case Dyninst::x86_64::ik1: return 18;
1490             case Dyninst::x86_64::ik2: return 19;
1491             case Dyninst::x86_64::ik3: return 20;
1492             case Dyninst::x86_64::ik4: return 21;
1493             case Dyninst::x86_64::ik5: return 22;
1494             case Dyninst::x86_64::ik6: return 23;
1495             case Dyninst::x86_64::ik7: return 24;
1496             case Dyninst::x86_64::izmm0: return 25;
1497             case Dyninst::x86_64::izmm1: return 26;
1498             case Dyninst::x86_64::izmm2: return 27;
1499             case Dyninst::x86_64::izmm3: return 28;
1500             case Dyninst::x86_64::izmm4: return 29;
1501             case Dyninst::x86_64::izmm5: return 30;
1502             case Dyninst::x86_64::izmm6: return 31;
1503             case Dyninst::x86_64::izmm7: return 32;
1504             case Dyninst::x86_64::izmm8: return 33;
1505             case Dyninst::x86_64::izmm9: return 34;
1506             case Dyninst::x86_64::izmm10: return 35;
1507             case Dyninst::x86_64::izmm11: return 36;
1508             case Dyninst::x86_64::izmm12: return 37;
1509             case Dyninst::x86_64::izmm13: return 38;
1510             case Dyninst::x86_64::izmm14: return 39;
1511             case Dyninst::x86_64::izmm15: return 40;
1512             case Dyninst::x86_64::izmm16: return 41;
1513             case Dyninst::x86_64::izmm17: return 42;
1514             case Dyninst::x86_64::izmm18: return 43;
1515             case Dyninst::x86_64::izmm19: return 44;
1516             case Dyninst::x86_64::izmm20: return 45;
1517             case Dyninst::x86_64::izmm21: return 46;
1518             case Dyninst::x86_64::izmm22: return 47;
1519             case Dyninst::x86_64::izmm23: return 48;
1520             case Dyninst::x86_64::izmm24: return 49;
1521             case Dyninst::x86_64::izmm25: return 50;
1522             case Dyninst::x86_64::izmm26: return 51;
1523             case Dyninst::x86_64::izmm27: return 52;
1524             case Dyninst::x86_64::izmm28: return 53;
1525             case Dyninst::x86_64::izmm29: return 54;
1526             case Dyninst::x86_64::izmm30: return 55;
1527             case Dyninst::x86_64::izmm31: return 56;
1528             case Dyninst::x86_64::iymm0: return 57;
1529             case Dyninst::x86_64::iymm1: return 58;
1530             case Dyninst::x86_64::iymm2: return 59;
1531             case Dyninst::x86_64::iymm3: return 60;
1532             case Dyninst::x86_64::iymm4: return 61;
1533             case Dyninst::x86_64::iymm5: return 62;
1534             case Dyninst::x86_64::iymm6: return 63;
1535             case Dyninst::x86_64::iymm7: return 64;
1536             case Dyninst::x86_64::iymm8: return 65;
1537             case Dyninst::x86_64::iymm9: return 66;
1538             case Dyninst::x86_64::iymm10: return 67;
1539             case Dyninst::x86_64::iymm11: return 68;
1540             case Dyninst::x86_64::iymm12: return 69;
1541             case Dyninst::x86_64::iymm13: return 70;
1542             case Dyninst::x86_64::iymm14: return 71;
1543             case Dyninst::x86_64::iymm15: return 72;
1544             case Dyninst::x86_64::iymm16: return 73;
1545             case Dyninst::x86_64::iymm17: return 74;
1546             case Dyninst::x86_64::iymm18: return 75;
1547             case Dyninst::x86_64::iymm19: return 76;
1548             case Dyninst::x86_64::iymm20: return 77;
1549             case Dyninst::x86_64::iymm21: return 78;
1550             case Dyninst::x86_64::iymm22: return 79;
1551             case Dyninst::x86_64::iymm23: return 80;
1552             case Dyninst::x86_64::iymm24: return 81;
1553             case Dyninst::x86_64::iymm25: return 82;
1554             case Dyninst::x86_64::iymm26: return 83;
1555             case Dyninst::x86_64::iymm27: return 84;
1556             case Dyninst::x86_64::iymm28: return 85;
1557             case Dyninst::x86_64::iymm29: return 86;
1558             case Dyninst::x86_64::iymm30: return 87;
1559             case Dyninst::x86_64::iymm31: return 88;
1560             case Dyninst::x86_64::ixmm0: return 89;
1561             case Dyninst::x86_64::ixmm1: return 90;
1562             case Dyninst::x86_64::ixmm2: return 91;
1563             case Dyninst::x86_64::ixmm3: return 92;
1564             case Dyninst::x86_64::ixmm4: return 93;
1565             case Dyninst::x86_64::ixmm5: return 94;
1566             case Dyninst::x86_64::ixmm6: return 95;
1567             case Dyninst::x86_64::ixmm7: return 96;
1568             case Dyninst::x86_64::ixmm8: return 97;
1569             case Dyninst::x86_64::ixmm9: return 98;
1570             case Dyninst::x86_64::ixmm10: return 99;
1571             case Dyninst::x86_64::ixmm11: return 100;
1572             case Dyninst::x86_64::ixmm12: return 101;
1573             case Dyninst::x86_64::ixmm13: return 102;
1574             case Dyninst::x86_64::ixmm14: return 103;
1575             case Dyninst::x86_64::ixmm15: return 104;
1576             case Dyninst::x86_64::ixmm16: return 105;
1577             case Dyninst::x86_64::ixmm17: return 106;
1578             case Dyninst::x86_64::ixmm18: return 107;
1579             case Dyninst::x86_64::ixmm19: return 108;
1580             case Dyninst::x86_64::ixmm20: return 109;
1581             case Dyninst::x86_64::ixmm21: return 110;
1582             case Dyninst::x86_64::ixmm22: return 111;
1583             case Dyninst::x86_64::ixmm23: return 112;
1584             case Dyninst::x86_64::ixmm24: return 113;
1585             case Dyninst::x86_64::ixmm25: return 114;
1586             case Dyninst::x86_64::ixmm26: return 115;
1587             case Dyninst::x86_64::ixmm27: return 116;
1588             case Dyninst::x86_64::ixmm28: return 117;
1589             case Dyninst::x86_64::ixmm29: return 118;
1590             case Dyninst::x86_64::ixmm30: return 119;
1591             case Dyninst::x86_64::ixmm31: return 120;
1592             //case Dyninst::x86_64::ist0: return 121;
1593             //case Dyninst::x86_64::ist1: return 122;
1594             //case Dyninst::x86_64::ist2: return 123;
1595             //case Dyninst::x86_64::ist3: return 124;
1596             //case Dyninst::x86_64::ist4: return 125;
1597             //case Dyninst::x86_64::ist5: return 126;
1598             //case Dyninst::x86_64::ist6: return 127;
1599             //case Dyninst::x86_64::ist7: return 128;
1600             case Dyninst::x86_64::imm0: return 129;
1601             case Dyninst::x86_64::imm1: return 130;
1602             case Dyninst::x86_64::imm2: return 131;
1603             case Dyninst::x86_64::imm3: return 132;
1604             case Dyninst::x86_64::imm4: return 133;
1605             case Dyninst::x86_64::imm5: return 134;
1606             case Dyninst::x86_64::imm6: return 135;
1607             case Dyninst::x86_64::imm7: return 136;
1608             case Dyninst::x86_64::iflags: return 137;
1609             case Dyninst::x86_64::ies: return 138;
1610             case Dyninst::x86_64::ics: return 139;
1611             case Dyninst::x86_64::iss: return 140;
1612             case Dyninst::x86_64::ids: return 141;
1613             case Dyninst::x86_64::ifs: return 142;
1614             case Dyninst::x86_64::igs: return 143;
1615             // INVALID REG 144
1616             // INVALID REG 145
1617             case Dyninst::x86_64::ifsbase: return 146;
1618             case Dyninst::x86_64::igsbase: return 147;
1619             default: return -1;
1620          }
1621          break;
1622       case Arch_ppc32:
1623          switch (val()) {
1624             case Dyninst::ppc32::ir0: return 0;
1625             case Dyninst::ppc32::ir1: return 1;
1626             case Dyninst::ppc32::ir2: return 2;
1627             case Dyninst::ppc32::ir3: return 3;
1628             case Dyninst::ppc32::ir4: return 4;
1629             case Dyninst::ppc32::ir5: return 5;
1630             case Dyninst::ppc32::ir6: return 6;
1631             case Dyninst::ppc32::ir7: return 7;
1632             case Dyninst::ppc32::ir8: return 8;
1633             case Dyninst::ppc32::ir9: return 9;
1634             case Dyninst::ppc32::ir10: return 10;
1635             case Dyninst::ppc32::ir11: return 11;
1636             case Dyninst::ppc32::ir12: return 12;
1637             case Dyninst::ppc32::ir13: return 13;
1638             case Dyninst::ppc32::ir14: return 14;
1639             case Dyninst::ppc32::ir15: return 15;
1640             case Dyninst::ppc32::ir16: return 16;
1641             case Dyninst::ppc32::ir17: return 17;
1642             case Dyninst::ppc32::ir18: return 18;
1643             case Dyninst::ppc32::ir19: return 19;
1644             case Dyninst::ppc32::ir20: return 20;
1645             case Dyninst::ppc32::ir21: return 21;
1646             case Dyninst::ppc32::ir22: return 22;
1647             case Dyninst::ppc32::ir23: return 23;
1648             case Dyninst::ppc32::ir24: return 24;
1649             case Dyninst::ppc32::ir25: return 25;
1650             case Dyninst::ppc32::ir26: return 26;
1651             case Dyninst::ppc32::ir27: return 27;
1652             case Dyninst::ppc32::ir28: return 28;
1653             case Dyninst::ppc32::ir29: return 29;
1654             case Dyninst::ppc32::ir30: return 30;
1655             case Dyninst::ppc32::ir31: return 31;
1656             case Dyninst::ppc32::ifpr0: return 32;
1657             case Dyninst::ppc32::ifpr1: return 33;
1658             case Dyninst::ppc32::ifpr2: return 34;
1659             case Dyninst::ppc32::ifpr3: return 35;
1660             case Dyninst::ppc32::ifpr4: return 36;
1661             case Dyninst::ppc32::ifpr5: return 37;
1662             case Dyninst::ppc32::ifpr6: return 38;
1663             case Dyninst::ppc32::ifpr7: return 39;
1664             case Dyninst::ppc32::ifpr8: return 40;
1665             case Dyninst::ppc32::ifpr9: return 41;
1666             case Dyninst::ppc32::ifpr10: return 42;
1667             case Dyninst::ppc32::ifpr11: return 43;
1668             case Dyninst::ppc32::ifpr12: return 44;
1669             case Dyninst::ppc32::ifpr13: return 45;
1670             case Dyninst::ppc32::ifpr14: return 46;
1671             case Dyninst::ppc32::ifpr15: return 47;
1672             case Dyninst::ppc32::ifpr16: return 48;
1673             case Dyninst::ppc32::ifpr17: return 49;
1674             case Dyninst::ppc32::ifpr18: return 50;
1675             case Dyninst::ppc32::ifpr19: return 51;
1676             case Dyninst::ppc32::ifpr20: return 52;
1677             case Dyninst::ppc32::ifpr21: return 53;
1678             case Dyninst::ppc32::ifpr22: return 54;
1679             case Dyninst::ppc32::ifpr23: return 55;
1680             case Dyninst::ppc32::ifpr24: return 56;
1681             case Dyninst::ppc32::ifpr25: return 57;
1682             case Dyninst::ppc32::ifpr26: return 58;
1683             case Dyninst::ppc32::ifpr27: return 59;
1684             case Dyninst::ppc32::ifpr28: return 60;
1685             case Dyninst::ppc32::ifpr29: return 61;
1686             case Dyninst::ppc32::ifpr30: return 62;
1687             case Dyninst::ppc32::ifpr31: return 63;
1688             case Dyninst::ppc32::icr: return 64;
1689             case Dyninst::ppc32::imq: return 100;
1690             case Dyninst::ppc32::ixer: return 101;
1691             case Dyninst::ppc32::ilr: return 108;
1692             case Dyninst::ppc32::ictr: return 109;
1693             default: return -1;
1694          }
1695       case Arch_ppc64:
1696          switch (val()) {
1697             case Dyninst::ppc64::ir0: return 0;
1698             case Dyninst::ppc64::ir1: return 1;
1699             case Dyninst::ppc64::ir2: return 2;
1700             case Dyninst::ppc64::ir3: return 3;
1701             case Dyninst::ppc64::ir4: return 4;
1702             case Dyninst::ppc64::ir5: return 5;
1703             case Dyninst::ppc64::ir6: return 6;
1704             case Dyninst::ppc64::ir7: return 7;
1705             case Dyninst::ppc64::ir8: return 8;
1706             case Dyninst::ppc64::ir9: return 9;
1707             case Dyninst::ppc64::ir10: return 10;
1708             case Dyninst::ppc64::ir11: return 11;
1709             case Dyninst::ppc64::ir12: return 12;
1710             case Dyninst::ppc64::ir13: return 13;
1711             case Dyninst::ppc64::ir14: return 14;
1712             case Dyninst::ppc64::ir15: return 15;
1713             case Dyninst::ppc64::ir16: return 16;
1714             case Dyninst::ppc64::ir17: return 17;
1715             case Dyninst::ppc64::ir18: return 18;
1716             case Dyninst::ppc64::ir19: return 19;
1717             case Dyninst::ppc64::ir20: return 20;
1718             case Dyninst::ppc64::ir21: return 21;
1719             case Dyninst::ppc64::ir22: return 22;
1720             case Dyninst::ppc64::ir23: return 23;
1721             case Dyninst::ppc64::ir24: return 24;
1722             case Dyninst::ppc64::ir25: return 25;
1723             case Dyninst::ppc64::ir26: return 26;
1724             case Dyninst::ppc64::ir27: return 27;
1725             case Dyninst::ppc64::ir28: return 28;
1726             case Dyninst::ppc64::ir29: return 29;
1727             case Dyninst::ppc64::ir30: return 30;
1728             case Dyninst::ppc64::ir31: return 31;
1729             case Dyninst::ppc64::ifpr0: return 32;
1730             case Dyninst::ppc64::ifpr1: return 33;
1731             case Dyninst::ppc64::ifpr2: return 34;
1732             case Dyninst::ppc64::ifpr3: return 35;
1733             case Dyninst::ppc64::ifpr4: return 36;
1734             case Dyninst::ppc64::ifpr5: return 37;
1735             case Dyninst::ppc64::ifpr6: return 38;
1736             case Dyninst::ppc64::ifpr7: return 39;
1737             case Dyninst::ppc64::ifpr8: return 40;
1738             case Dyninst::ppc64::ifpr9: return 41;
1739             case Dyninst::ppc64::ifpr10: return 42;
1740             case Dyninst::ppc64::ifpr11: return 43;
1741             case Dyninst::ppc64::ifpr12: return 44;
1742             case Dyninst::ppc64::ifpr13: return 45;
1743             case Dyninst::ppc64::ifpr14: return 46;
1744             case Dyninst::ppc64::ifpr15: return 47;
1745             case Dyninst::ppc64::ifpr16: return 48;
1746             case Dyninst::ppc64::ifpr17: return 49;
1747             case Dyninst::ppc64::ifpr18: return 50;
1748             case Dyninst::ppc64::ifpr19: return 51;
1749             case Dyninst::ppc64::ifpr20: return 52;
1750             case Dyninst::ppc64::ifpr21: return 53;
1751             case Dyninst::ppc64::ifpr22: return 54;
1752             case Dyninst::ppc64::ifpr23: return 55;
1753             case Dyninst::ppc64::ifpr24: return 56;
1754             case Dyninst::ppc64::ifpr25: return 57;
1755             case Dyninst::ppc64::ifpr26: return 58;
1756             case Dyninst::ppc64::ifpr27: return 59;
1757             case Dyninst::ppc64::ifpr28: return 60;
1758             case Dyninst::ppc64::ifpr29: return 61;
1759             case Dyninst::ppc64::ifpr30: return 62;
1760             case Dyninst::ppc64::ifpr31: return 63;
1761             case Dyninst::ppc64::icr: return 64;
1762             case Dyninst::ppc64::imq: return 100;
1763             case Dyninst::ppc64::ixer: return 101;
1764             case Dyninst::ppc64::ilr: return 108;
1765             case Dyninst::ppc64::ictr: return 109;
1766             default: return -1;
1767          }
1768          break;
1769       case Arch_aarch64:
1770          switch (val()) {
1771             case Dyninst::aarch64::ix0:             return 0;
1772             case Dyninst::aarch64::ix1:             return 1;
1773             case Dyninst::aarch64::ix2:             return 2;
1774             case Dyninst::aarch64::ix3:             return 3;
1775             case Dyninst::aarch64::ix4:             return 4;
1776             case Dyninst::aarch64::ix5:             return 5;
1777             case Dyninst::aarch64::ix6:             return 6;
1778             case Dyninst::aarch64::ix7:             return 7;
1779             case Dyninst::aarch64::ix8:             return 8;
1780             case Dyninst::aarch64::ix9:             return 9;
1781             case Dyninst::aarch64::ix10:        return 10;
1782             case Dyninst::aarch64::ix11:        return 11;
1783             case Dyninst::aarch64::ix12:        return 12;
1784             case Dyninst::aarch64::ix13:        return 13;
1785             case Dyninst::aarch64::ix14:        return 14;
1786             case Dyninst::aarch64::ix15:        return 15;
1787             case Dyninst::aarch64::ix16:        return 16;
1788             case Dyninst::aarch64::ix17:        return 17;
1789             case Dyninst::aarch64::ix18:        return 18;
1790             case Dyninst::aarch64::ix19:        return 19;
1791             case Dyninst::aarch64::ix20:        return 20;
1792             case Dyninst::aarch64::ix21:        return 21;
1793             case Dyninst::aarch64::ix22:        return 22;
1794             case Dyninst::aarch64::ix23:        return 23;
1795             case Dyninst::aarch64::ix24:        return 24;
1796             case Dyninst::aarch64::ix25:        return 25;
1797             case Dyninst::aarch64::ix26:        return 26;
1798             case Dyninst::aarch64::ix27:        return 27;
1799             case Dyninst::aarch64::ix28:        return 28;
1800             case Dyninst::aarch64::ix29:        return 29;
1801             case Dyninst::aarch64::ix30:        return 30;
1802             case Dyninst::aarch64::isp:      return 31;
1803
1804             case Dyninst::aarch64::iq0:      return 64;
1805             case Dyninst::aarch64::iq1:      return 65;
1806             case Dyninst::aarch64::iq2:      return 66;
1807             case Dyninst::aarch64::iq3:      return 67;
1808             case Dyninst::aarch64::iq4:      return 68;
1809             case Dyninst::aarch64::iq5:      return 69;
1810             case Dyninst::aarch64::iq6:      return 70;
1811             case Dyninst::aarch64::iq7:      return 71;
1812             case Dyninst::aarch64::iq8:      return 72;
1813             case Dyninst::aarch64::iq9:      return 73;
1814             case Dyninst::aarch64::iq10:     return 74;
1815             case Dyninst::aarch64::iq11:     return 75;
1816             case Dyninst::aarch64::iq12:     return 76;
1817             case Dyninst::aarch64::iq13:     return 77;
1818             case Dyninst::aarch64::iq14:     return 78;
1819             case Dyninst::aarch64::iq15:     return 79;
1820             case Dyninst::aarch64::iq16:     return 80;
1821             case Dyninst::aarch64::iq17:     return 81;
1822             case Dyninst::aarch64::iq18:     return 82;
1823             case Dyninst::aarch64::iq19:     return 83;
1824             case Dyninst::aarch64::iq20:     return 84;
1825             case Dyninst::aarch64::iq21:     return 85;
1826             case Dyninst::aarch64::iq22:     return 86;
1827             case Dyninst::aarch64::iq23:     return 87;
1828             case Dyninst::aarch64::iq24:     return 88;
1829             case Dyninst::aarch64::iq25:     return 89;
1830             case Dyninst::aarch64::iq26:     return 90;
1831             case Dyninst::aarch64::iq27:     return 91;
1832             case Dyninst::aarch64::iq28:     return 92;
1833             case Dyninst::aarch64::iq29:     return 93;
1834             case Dyninst::aarch64::iq30:     return 94;
1835             case Dyninst::aarch64::iq31:     return 95;
1836
1837             default: return -1;
1838          }
1839          break;
1840       case Arch_none:
1841          assert(0);
1842          return -1;
1843       default:
1844         assert(0);
1845         return -1;
1846    }
1847    //Invalid register passed
1848    return -1;
1849 }
1850
1851 unsigned Dyninst::getArchAddressWidth(Dyninst::Architecture arch)
1852 {
1853    switch (arch) {
1854       case Arch_none:
1855          return 0;
1856       case Arch_x86:
1857       case Arch_ppc32:
1858          return 4;
1859       case Arch_x86_64:
1860       case Arch_ppc64:
1861       case Arch_aarch64:
1862          return 8;
1863       default:
1864          assert(0);
1865          return InvalidReg;
1866    }
1867    return 0;
1868 }
1869
1870 MachRegister MachRegister::getArchReg(unsigned int regNum, Dyninst::Architecture arch){
1871     switch(arch){
1872       case Arch_aarch64:
1873          switch(regNum){
1874             case 0:  return Dyninst::aarch64::x0;
1875             case 1:  return Dyninst::aarch64::x1;
1876             case 2:  return Dyninst::aarch64::x2;
1877             case 3:  return Dyninst::aarch64::x3;
1878             case 4:  return Dyninst::aarch64::x4;
1879             case 5:  return Dyninst::aarch64::x5;
1880             case 6:  return Dyninst::aarch64::x6;
1881             case 7:  return Dyninst::aarch64::x7;
1882             case 8:  return Dyninst::aarch64::x8;
1883             case 9:  return Dyninst::aarch64::x9;
1884             case 10: return Dyninst::aarch64::x10;
1885             case 11: return Dyninst::aarch64::x11;
1886             case 12: return Dyninst::aarch64::x12;
1887             case 13: return Dyninst::aarch64::x13;
1888             case 14: return Dyninst::aarch64::x14;
1889             case 15: return Dyninst::aarch64::x15;
1890             case 16: return Dyninst::aarch64::x16;
1891             case 17: return Dyninst::aarch64::x17;
1892             case 18: return Dyninst::aarch64::x18;
1893             case 19: return Dyninst::aarch64::x19;
1894             case 20: return Dyninst::aarch64::x20;
1895             case 21: return Dyninst::aarch64::x21;
1896             case 22: return Dyninst::aarch64::x22;
1897             case 23: return Dyninst::aarch64::x23;
1898             case 24: return Dyninst::aarch64::x24;
1899             case 25: return Dyninst::aarch64::x25;
1900             case 26: return Dyninst::aarch64::x26;
1901             case 27: return Dyninst::aarch64::x27;
1902             case 28: return Dyninst::aarch64::x28;
1903             case 29: return Dyninst::aarch64::x29;
1904             case 30: return Dyninst::aarch64::x30;
1905
1906             case 100: return Dyninst::aarch64::sp;
1907             case 101: return Dyninst::aarch64::pc;
1908             case 102: return Dyninst::aarch64::pstate;
1909             case 103: return Dyninst::aarch64::zr;
1910          }
1911       default:
1912          return InvalidReg;
1913     }
1914     return InvalidReg;
1915 }