Add xmm8-xmm15 liveness information/decoding.
[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 #include "Register.h"
38 #include "dyn_regs.h"
39
40 using namespace Dyninst;
41 using namespace Dyninst::InstructionAPI;
42 using namespace std;
43 using namespace boost::assign;
44
45 map<MachRegister, Register> reverseRegisterMap = map_list_of
46         (x86_64::r8, REGNUM_R8)
47         (x86_64::r9, REGNUM_R9)
48         (x86_64::r10, REGNUM_R10)
49         (x86_64::r11, REGNUM_R11)
50         (x86_64::r12, REGNUM_R12)
51         (x86_64::r13, REGNUM_R13)
52         (x86_64::r14, REGNUM_R14)
53         (x86_64::r15, REGNUM_R15)
54         (x86_64::cs, REGNUM_IGNORED)
55         (x86_64::ds, REGNUM_IGNORED)
56         (x86_64::es, REGNUM_IGNORED)
57         (x86_64::fs, REGNUM_IGNORED)
58         (x86_64::gs, REGNUM_IGNORED)
59         (x86_64::ss, REGNUM_IGNORED)
60         (x86_64::rax, REGNUM_RAX)
61         (x86_64::rcx, REGNUM_RCX)
62         (x86_64::rdx, REGNUM_RDX)
63         (x86_64::rbx, REGNUM_RBX)
64         (x86_64::rsp, REGNUM_RSP)
65         (x86_64::rbp, REGNUM_RBP)
66         (x86_64::rsi, REGNUM_RSI)
67         (x86_64::rdi, REGNUM_RDI)
68         (x86_64::rip, REGNUM_IGNORED)
69         (x86_64::cf, REGNUM_CF)
70         (x86_64::pf, REGNUM_PF)
71         (x86_64::af, REGNUM_AF)
72         (x86_64::zf, REGNUM_ZF)  
73         (x86_64::sf, REGNUM_SF)
74         (x86_64::tf, REGNUM_TF)
75         (x86_64::df, REGNUM_DF)
76         (x86_64::of, REGNUM_OF)
77         (x86_64::nt_, REGNUM_NT)
78         (x86_64::if_, REGNUM_IF)
79         (x86_64::flags, REGNUM_EFLAGS)
80         (x86_64::xmm0, REGNUM_XMM0)
81         (x86_64::xmm1, REGNUM_XMM1)
82         (x86_64::xmm2, REGNUM_XMM2)
83         (x86_64::xmm3, REGNUM_XMM3)
84         (x86_64::xmm4, REGNUM_XMM4)
85         (x86_64::xmm5, REGNUM_XMM5)
86         (x86_64::xmm6, REGNUM_XMM6)
87         (x86_64::xmm7, REGNUM_XMM7)
88         (x86_64::xmm8, REGNUM_XMM8)
89         (x86_64::xmm9, REGNUM_XMM9)
90         (x86_64::xmm10, REGNUM_XMM10)
91         (x86_64::xmm11, REGNUM_XMM11)
92         (x86_64::xmm12, REGNUM_XMM12)
93         (x86_64::xmm13, REGNUM_XMM13)
94         (x86_64::xmm14, REGNUM_XMM14)
95         (x86_64::xmm15, REGNUM_XMM15)
96         (x86_64::mm0, REGNUM_DUMMYFPR)
97         (x86_64::mm1, REGNUM_DUMMYFPR)
98         (x86_64::mm2, REGNUM_DUMMYFPR)
99         (x86_64::mm3, REGNUM_DUMMYFPR)
100         (x86_64::mm4, REGNUM_DUMMYFPR)
101         (x86_64::mm5, REGNUM_DUMMYFPR)
102         (x86_64::mm6, REGNUM_DUMMYFPR)
103         (x86_64::mm7, REGNUM_DUMMYFPR)
104         (x86_64::cr0, REGNUM_IGNORED)
105         (x86_64::cr1, REGNUM_IGNORED)
106         (x86_64::cr2, REGNUM_IGNORED)
107         (x86_64::cr3, REGNUM_IGNORED)
108         (x86_64::cr4, REGNUM_IGNORED)
109         (x86_64::cr5, REGNUM_IGNORED)
110         (x86_64::cr6, REGNUM_IGNORED)
111         (x86_64::cr7, REGNUM_IGNORED)
112         (x86_64::dr0, REGNUM_IGNORED)
113         (x86_64::dr1, REGNUM_IGNORED)
114         (x86_64::dr2, REGNUM_IGNORED)
115         (x86_64::dr3, REGNUM_IGNORED)
116         (x86_64::dr4, REGNUM_IGNORED)
117         (x86_64::dr5, REGNUM_IGNORED)
118         (x86_64::dr6, REGNUM_IGNORED)
119         (x86_64::dr7, REGNUM_IGNORED)
120         (x86_64::st0, REGNUM_DUMMYFPR)
121         (x86_64::st1, REGNUM_DUMMYFPR)
122         (x86_64::st2, REGNUM_DUMMYFPR)
123         (x86_64::st3, REGNUM_DUMMYFPR)
124         (x86_64::st4, REGNUM_DUMMYFPR)
125         (x86_64::st5, REGNUM_DUMMYFPR)
126         (x86_64::st6, REGNUM_DUMMYFPR)
127         (x86_64::st7, REGNUM_DUMMYFPR)
128         ;
129
130 Register convertRegID(MachRegister reg, bool &wasUpcast) {
131     wasUpcast = false;
132     if(reg.getBaseRegister().val() != reg.val()) wasUpcast = true;
133     MachRegister baseReg = MachRegister((reg.getBaseRegister().val() & ~reg.getArchitecture()) | Arch_x86_64);
134 //    RegisterAST::Ptr debug(new RegisterAST(baseReg));
135 //    fprintf(stderr, "DEBUG: converting %s", toBeConverted->format().c_str());
136 //    fprintf(stderr, " to %s\n", debug->format().c_str());
137     map<MachRegister, Register>::const_iterator found =
138             reverseRegisterMap.find(baseReg);
139     if(found == reverseRegisterMap.end()) {
140       assert(!"Bad register ID");
141     }
142     if(found->second == REGNUM_DUMMYFPR) {
143         wasUpcast = true;
144         if(reg.getArchitecture() == Arch_x86)
145         {
146             return IA32_FPR_VIRTUAL_REGISTER;
147         }
148     }
149     return found->second;
150 }
151
152
153 Register convertRegID(RegisterAST::Ptr toBeConverted, bool& wasUpcast)
154 {
155     return convertRegID(toBeConverted.get(), wasUpcast);
156 }
157         
158 Register convertRegID(RegisterAST* toBeConverted, bool& wasUpcast)
159 {
160     if(!toBeConverted) {
161         //assert(0);
162         return REGNUM_IGNORED;
163     }
164     return convertRegID(toBeConverted->getID(), wasUpcast);
165 }