Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / RegisterConversion-x86.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 #include "RegisterConversion-x86.h"
33 #include "inst-x86.h"
34
35 #include <map>
36 #include <boost/assign/list_of.hpp>
37 using namespace Dyninst::InstructionAPI;
38 using namespace std;
39 using namespace boost::assign;
40
41 map<IA32Regs, Register> reverseRegisterMap = map_list_of
42         (r_EAX, REGNUM_RAX)
43         (r_ECX, REGNUM_RCX)
44         (r_EDX, REGNUM_RDX)
45         (r_EBX, REGNUM_RBX)
46         (r_ESP, REGNUM_RSP)
47         (r_EBP, REGNUM_RBP)
48         (r_ESI, REGNUM_RSI)
49         (r_EDI, REGNUM_RDI)
50         (r_R8, REGNUM_R8)
51         (r_R9, REGNUM_R9)
52         (r_R10, REGNUM_R10)
53         (r_R11, REGNUM_R11)
54         (r_R12, REGNUM_R12)
55         (r_R13, REGNUM_R13)
56         (r_R14, REGNUM_R14)
57         (r_R15, REGNUM_R15)
58         (r_DummyFPR, REGNUM_DUMMYFPR)
59         (r_OF, REGNUM_OF)
60         (r_SF, REGNUM_SF)
61         (r_ZF, REGNUM_ZF)
62         (r_AF, REGNUM_AF)
63         (r_PF, REGNUM_PF)
64         (r_CF, REGNUM_CF)
65         (r_TF, REGNUM_TF)
66         (r_IF, REGNUM_IF)
67         (r_DF, REGNUM_DF)
68         (r_NT, REGNUM_NT)
69         (r_RF, REGNUM_RF)
70         (r_AH, REGNUM_RAX)
71         (r_BH, REGNUM_RBX)
72         (r_CH, REGNUM_RCX)
73         (r_DH, REGNUM_RDX)
74         (r_AL, REGNUM_RAX)
75         (r_BL, REGNUM_RBX)
76         (r_CL, REGNUM_RCX)
77         (r_DL, REGNUM_RDX)
78         (r_SPL, REGNUM_RSP)
79         (r_BPL, REGNUM_RBP)
80         (r_SIL, REGNUM_RSI)
81         (r_DIL, REGNUM_RDI)
82         (r_eAX, REGNUM_RAX)
83         (r_eBX, REGNUM_RBX)
84         (r_eCX, REGNUM_RCX)
85         (r_eDX, REGNUM_RDX)
86         (r_AX, REGNUM_RAX)
87         (r_DX, REGNUM_RDX)
88         (r_eSP, REGNUM_RSP)
89         (r_eBP, REGNUM_RBP)
90         (r_eSI, REGNUM_RSI)
91         (r_eDI, REGNUM_RDI)
92     // These are wrong, need to extend to make cmpxch8b work right
93         (r_EDXEAX, REGNUM_RAX)
94         (r_ECXEBX, REGNUM_RCX)
95         (r_CS, REGNUM_IGNORED)
96         (r_DS, REGNUM_IGNORED)
97         (r_ES, REGNUM_IGNORED)
98         (r_FS, REGNUM_IGNORED)
99         (r_GS, REGNUM_IGNORED)
100         (r_SS, REGNUM_IGNORED)
101         (r_rAX, REGNUM_RAX)
102         (r_rCX, REGNUM_RCX)
103         (r_rDX, REGNUM_RDX)
104         (r_rBX, REGNUM_RBX)
105         (r_rSP, REGNUM_RSP)
106         (r_rBP, REGNUM_RBP)
107         (r_rSI, REGNUM_RSI)
108         (r_rDI, REGNUM_RDI)
109         (r_EFLAGS, REGNUM_IGNORED)
110         (r_EIP, REGNUM_IGNORED)
111         (r_RIP, REGNUM_IGNORED)
112         (r_RAX, REGNUM_RAX)
113         (r_RCX, REGNUM_RCX)
114         (r_RDX, REGNUM_RDX)
115         (r_RBX, REGNUM_RBX)
116         (r_RSP, REGNUM_RSP)
117         (r_RBP, REGNUM_RBP)
118         (r_RSI, REGNUM_RSI)
119         (r_RDI, REGNUM_RDI)
120         (r_SI, REGNUM_RSI)
121         (r_DI, REGNUM_RDI)
122         (r_XMM0, REGNUM_XMM0)
123         (r_XMM1, REGNUM_XMM1)
124         (r_XMM2, REGNUM_XMM2)
125         (r_XMM3, REGNUM_XMM3)
126         (r_XMM4, REGNUM_XMM4)
127         (r_XMM5, REGNUM_XMM5)
128         (r_XMM6, REGNUM_XMM6)
129         (r_XMM7, REGNUM_XMM7)
130         (r_MM0, REGNUM_MM0)
131         (r_MM1, REGNUM_MM1)
132         (r_MM2, REGNUM_MM2)
133         (r_MM3, REGNUM_MM3)
134         (r_MM4, REGNUM_MM4)
135         (r_MM5, REGNUM_MM5)
136         (r_MM6, REGNUM_MM6)
137         (r_MM7, REGNUM_MM7)
138         (r_CR0, REGNUM_IGNORED)
139         (r_CR1, REGNUM_IGNORED)
140         (r_CR2, REGNUM_IGNORED)
141         (r_CR3, REGNUM_IGNORED)
142         (r_CR4, REGNUM_IGNORED)
143         (r_CR5, REGNUM_IGNORED)
144         (r_CR6, REGNUM_IGNORED)
145         (r_CR7, REGNUM_IGNORED)
146         (r_DR0, REGNUM_IGNORED)
147         (r_DR1, REGNUM_IGNORED)
148         (r_DR2, REGNUM_IGNORED)
149         (r_DR3, REGNUM_IGNORED)
150         (r_DR4, REGNUM_IGNORED)
151         (r_DR5, REGNUM_IGNORED)
152         (r_DR6, REGNUM_IGNORED)
153         (r_DR7, REGNUM_IGNORED)
154         (r_ALLGPRS, REGNUM_IGNORED)
155   (r_ST0, REGNUM_IGNORED)
156   (r_ST1, REGNUM_IGNORED)
157   (r_ST2, REGNUM_IGNORED)
158   (r_ST3, REGNUM_IGNORED)
159   (r_ST4, REGNUM_IGNORED)
160   (r_ST5, REGNUM_IGNORED)
161   (r_ST6, REGNUM_IGNORED)
162   (r_ST7, REGNUM_IGNORED)
163         ;
164
165 Register convertRegID(IA32Regs toBeConverted)
166 {
167     map<IA32Regs, Register>::const_iterator found =
168             reverseRegisterMap.find(toBeConverted);
169     if(found == reverseRegisterMap.end()) {
170         fprintf(stderr, "Register ID %d not found in reverseRegisterLookup!\n", toBeConverted);
171         assert(!"Bad register ID");
172     }
173     return found->second;
174 }