Calculation of immediate operand in logical immediate instructions was done wrong...
[dyninst.git] / instructionAPI / h / RegisterIDs.h
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 #if !defined(REGISTER_IDS_X86_H)
32 #define REGISTER_IDS_X86_H
33
34 #include <vector>
35 #include <map>
36 #include "util.h"
37 #include "Result.h"
38 #include <dyntypes.h>
39 namespace Dyninst
40 {
41   namespace InstructionAPI
42   {
43     /// \enum Dyninst::InstructionAPI::IA32Regs
44     /// \brief Registers for IA32 and AMD64 processors.
45     ///
46     // We REALLY REALLY NEED these definitions to stay aligned as given,
47     // so (e.g.) (r_EAX - r_AH) == (r_EDX - r_DH). We use that later
48     // for upconverting overlapping/aliased registers.
49     enum IA32Regs { r_AH=0, r_BH, r_CH, r_DH, 
50                     r_AL=10, r_BL, r_CL, r_DL,
51                     r_AX=20, r_BX, r_CX, r_DX, r_SI, r_DI,
52                     r_eAX=30, r_eBX, r_eCX, r_eDX, r_eSI, r_eDI,
53                     r_EAX=40, r_EBX, r_ECX, r_EDX, r_ESI, r_EDI,
54                     r_eSP=50, r_eBP,
55                     r_ESP=60, r_EBP,
56                     r_EDXEAX=70, r_ECXEBX, //133
57                     r_EFLAGS=100,
58                     r_CS=110, r_DS, r_ES, r_FS, r_GS, r_SS,
59                     r_EIP=120,
60                     // flags need to be separate registers for proper liveness analysis
61                     r_DummyFPR=130, r_Reserved,
62                     // and we have a dummy register to make liveness consistent since floating point saves are all/none at present
63                     r_rAX=140, r_rBX, r_rCX, r_rDX, r_rSI, r_rDI,
64                     r_RAX=150, r_RBX, r_RCX, r_RDX, r_RSI, r_RDI,
65                     r_rSP=160, r_rBP,
66                     r_RSP=170, r_RBP,
67                     r_R8=180, r_R9, r_R10, r_R11, r_R12, r_R13, r_R14, r_R15,
68                     // AMD64 GPRs
69                     r_RIP=190,
70                     r_XMM0=200, r_XMM1, r_XMM2, r_XMM3, r_XMM4, r_XMM5, r_XMM6, r_XMM7,
71                     r_MM0, r_MM1, r_MM2, r_MM3, r_MM4, r_MM5, r_MM6, r_MM7,
72                     r_CR0, r_CR1, r_CR2, r_CR3, r_CR4, r_CR5, r_CR6, r_CR7,
73                     r_DR0, r_DR1, r_DR2, r_DR3, r_DR4, r_DR5, r_DR6, r_DR7,
74                     r_TR0, r_TR1, r_TR2, r_TR3, r_TR4, r_TR5, r_TR6, r_TR7,
75                     r_SPL, r_BPL, r_SIL, r_DIL,
76                     // FP Stack
77                     r_ST0, r_ST1, r_ST2, r_ST3, r_ST4, r_ST5, r_ST6, r_ST7,
78                     r_ALLGPRS,
79                     r_OF=11, r_SF=7, r_ZF=6, r_AF=4, r_PF=2, r_CF=0, r_TF=8, r_IF=9, r_DF=10, r_NT=14, r_RF=16,
80                     // NOTE: 11 of these!
81     
82     };
83
84     /// The %RegInfo struct associates a register ID with its size and name.
85     struct RegInfo
86     {
87       RegInfo(Result_Type t, std::string n) :
88         regSize(t), regName(n) 
89       {
90       }
91       RegInfo() :
92         regSize(u8), regName("*** UNDEFINED REGISTER ***")
93       {
94       }
95             
96       Result_Type regSize;
97       std::string regName;
98     };
99   };
100 };
101           
102 #if defined(__GNUC__)
103 #if !defined(cap_tr1)
104 namespace __gnu_cxx 
105 {
106   template<> struct hash<Dyninst::InstructionAPI::IA32Regs> {
107     hash<unsigned int> h;
108     unsigned operator()(const Dyninst::InstructionAPI::IA32Regs &e) const 
109     {
110       return h(static_cast<unsigned int>(e));
111     };
112   };
113 }
114 #else
115 namespace std 
116 {
117   namespace tr1
118   {
119     template <>
120     struct hash<Dyninst::InstructionAPI::IA32Regs>
121     {
122       size_t operator()(const Dyninst::InstructionAPI::IA32Regs &e) const
123       {
124         return static_cast<size_t>(e);
125       };
126     };
127   }   
128 }
129 #endif
130 #endif
131           
132           
133 namespace Dyninst
134 {
135   namespace InstructionAPI
136   {
137     typedef dyn_hash_map<IA32Regs, RegInfo> RegTable;
138     /// \brief Register names for disassembly and debugging
139     struct IA32RegTable
140     {
141       IA32RegTable() {}
142       RegTable IA32_register_names;
143       Result_Type getSize(int id) 
144       {
145         RegTable::const_iterator found = IA32_register_names.find((IA32Regs)(id));
146         if(found != IA32_register_names.end()) {
147           return found->second.regSize;
148         }
149         // Sane default
150         return u32;
151       }
152       
153     };
154
155   };
156 };
157
158
159
160 #endif //!defined(REGISTER_IDS_X86_H)