1 /////////////////////////////////////////////////////////////////////////
2 // $Id: resolve64.cc,v 1.10 2007/04/09 21:15:00 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
5 // Copyright (C) 2001 MandrakeSoft S.A.
9 // 75002 Paris - France
10 // http://www.linux-mandrake.com/
11 // http://www.mandrakesoft.com/
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Lesser General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 // Lesser General Public License for more details.
23 // You should have received a copy of the GNU Lesser General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #define NEED_CPU_REG_SHORTCUTS 1
31 #define LOG_THIS BX_CPU_THIS_PTR
36 void BX_CPP_AttrRegparmN(1)
37 BX_CPU_C::Resolve64Mod0Rm0(bxInstruction_c
*i
)
41 void BX_CPP_AttrRegparmN(1)
42 BX_CPU_C::Resolve64Mod0Rm1(bxInstruction_c
*i
)
46 void BX_CPP_AttrRegparmN(1)
47 BX_CPU_C::Resolve64Mod0Rm2(bxInstruction_c
*i
)
51 void BX_CPP_AttrRegparmN(1)
52 BX_CPU_C::Resolve64Mod0Rm3(bxInstruction_c
*i
)
56 void BX_CPP_AttrRegparmN(1)
57 BX_CPU_C::Resolve64Mod0Rip(bxInstruction_c
*i
)
59 // RIP hasn't been bumped yet when this is called. must choose the saved value.
60 RMAddr(i
) = BX_CPU_THIS_PTR prev_eip
+ i
->ilen() + (Bit32s
)i
->displ32u();
62 void BX_CPP_AttrRegparmN(1)
63 BX_CPU_C::Resolve64Mod0Rm6(bxInstruction_c
*i
)
67 void BX_CPP_AttrRegparmN(1)
68 BX_CPU_C::Resolve64Mod0Rm7(bxInstruction_c
*i
)
72 void BX_CPP_AttrRegparmN(1)
73 BX_CPU_C::Resolve64Mod0Rm8(bxInstruction_c
*i
)
77 void BX_CPP_AttrRegparmN(1)
78 BX_CPU_C::Resolve64Mod0Rm9(bxInstruction_c
*i
)
82 void BX_CPP_AttrRegparmN(1)
83 BX_CPU_C::Resolve64Mod0Rm10(bxInstruction_c
*i
)
87 void BX_CPP_AttrRegparmN(1)
88 BX_CPU_C::Resolve64Mod0Rm11(bxInstruction_c
*i
)
92 void BX_CPP_AttrRegparmN(1)
93 BX_CPU_C::Resolve64Mod0Rm14(bxInstruction_c
*i
)
97 void BX_CPP_AttrRegparmN(1)
98 BX_CPU_C::Resolve64Mod0Rm15(bxInstruction_c
*i
)
104 void BX_CPP_AttrRegparmN(1)
105 BX_CPU_C::Resolve64Mod1or2Rm0(bxInstruction_c
*i
)
107 RMAddr(i
) = RAX
+ (Bit32s
) i
->displ32u();
109 void BX_CPP_AttrRegparmN(1)
110 BX_CPU_C::Resolve64Mod1or2Rm1(bxInstruction_c
*i
)
112 RMAddr(i
) = RCX
+ (Bit32s
) i
->displ32u();
114 void BX_CPP_AttrRegparmN(1)
115 BX_CPU_C::Resolve64Mod1or2Rm2(bxInstruction_c
*i
)
117 RMAddr(i
) = RDX
+ (Bit32s
) i
->displ32u();
119 void BX_CPP_AttrRegparmN(1)
120 BX_CPU_C::Resolve64Mod1or2Rm3(bxInstruction_c
*i
)
122 RMAddr(i
) = RBX
+ (Bit32s
) i
->displ32u();
124 void BX_CPP_AttrRegparmN(1)
125 BX_CPU_C::Resolve64Mod1or2Rm5(bxInstruction_c
*i
)
127 RMAddr(i
) = RBP
+ (Bit32s
) i
->displ32u();
129 void BX_CPP_AttrRegparmN(1)
130 BX_CPU_C::Resolve64Mod1or2Rm6(bxInstruction_c
*i
)
132 RMAddr(i
) = RSI
+ (Bit32s
) i
->displ32u();
134 void BX_CPP_AttrRegparmN(1)
135 BX_CPU_C::Resolve64Mod1or2Rm7(bxInstruction_c
*i
)
137 RMAddr(i
) = RDI
+ (Bit32s
) i
->displ32u();
139 void BX_CPP_AttrRegparmN(1)
140 BX_CPU_C::Resolve64Mod1or2Rm8(bxInstruction_c
*i
)
142 RMAddr(i
) = R8
+ (Bit32s
) i
->displ32u();
144 void BX_CPP_AttrRegparmN(1)
145 BX_CPU_C::Resolve64Mod1or2Rm9(bxInstruction_c
*i
)
147 RMAddr(i
) = R9
+ (Bit32s
) i
->displ32u();
149 void BX_CPP_AttrRegparmN(1)
150 BX_CPU_C::Resolve64Mod1or2Rm10(bxInstruction_c
*i
)
152 RMAddr(i
) = R10
+ (Bit32s
) i
->displ32u();
154 void BX_CPP_AttrRegparmN(1)
155 BX_CPU_C::Resolve64Mod1or2Rm11(bxInstruction_c
*i
)
157 RMAddr(i
) = R11
+ (Bit32s
) i
->displ32u();
159 void BX_CPP_AttrRegparmN(1)
160 BX_CPU_C::Resolve64Mod1or2Rm13(bxInstruction_c
*i
)
162 RMAddr(i
) = R13
+ (Bit32s
) i
->displ32u();
164 void BX_CPP_AttrRegparmN(1)
165 BX_CPU_C::Resolve64Mod1or2Rm14(bxInstruction_c
*i
)
167 RMAddr(i
) = R14
+ (Bit32s
) i
->displ32u();
169 void BX_CPP_AttrRegparmN(1)
170 BX_CPU_C::Resolve64Mod1or2Rm15(bxInstruction_c
*i
)
172 RMAddr(i
) = R15
+ (Bit32s
) i
->displ32u();
176 void BX_CPP_AttrRegparmN(1)
177 BX_CPU_C::Resolve64Mod0Base0(bxInstruction_c
*i
)
179 if (i
->sibIndex() != 4)
180 RMAddr(i
) = RAX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
184 void BX_CPP_AttrRegparmN(1)
185 BX_CPU_C::Resolve64Mod0Base1(bxInstruction_c
*i
)
187 if (i
->sibIndex() != 4)
188 RMAddr(i
) = RCX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
192 void BX_CPP_AttrRegparmN(1)
193 BX_CPU_C::Resolve64Mod0Base2(bxInstruction_c
*i
)
195 if (i
->sibIndex() != 4)
196 RMAddr(i
) = RDX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
200 void BX_CPP_AttrRegparmN(1)
201 BX_CPU_C::Resolve64Mod0Base3(bxInstruction_c
*i
)
203 if (i
->sibIndex() != 4)
204 RMAddr(i
) = RBX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
208 void BX_CPP_AttrRegparmN(1)
209 BX_CPU_C::Resolve64Mod0Base4(bxInstruction_c
*i
)
211 if (i
->sibIndex() != 4)
212 RMAddr(i
) = RSP
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
216 void BX_CPP_AttrRegparmN(1)
217 BX_CPU_C::Resolve64Mod0Base5(bxInstruction_c
*i
)
219 if (i
->sibIndex() != 4)
220 RMAddr(i
) = (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
222 RMAddr(i
) = (Bit32s
) i
->displ32u();
224 void BX_CPP_AttrRegparmN(1)
225 BX_CPU_C::Resolve64Mod0Base6(bxInstruction_c
*i
)
227 if (i
->sibIndex() != 4)
228 RMAddr(i
) = RSI
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
232 void BX_CPP_AttrRegparmN(1)
233 BX_CPU_C::Resolve64Mod0Base7(bxInstruction_c
*i
)
235 if (i
->sibIndex() != 4)
236 RMAddr(i
) = RDI
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
240 void BX_CPP_AttrRegparmN(1)
241 BX_CPU_C::Resolve64Mod0Base8(bxInstruction_c
*i
)
243 if (i
->sibIndex() != 4)
244 RMAddr(i
) = R8
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
248 void BX_CPP_AttrRegparmN(1)
249 BX_CPU_C::Resolve64Mod0Base9(bxInstruction_c
*i
)
251 if (i
->sibIndex() != 4)
252 RMAddr(i
) = R9
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
256 void BX_CPP_AttrRegparmN(1)
257 BX_CPU_C::Resolve64Mod0Base10(bxInstruction_c
*i
)
259 if (i
->sibIndex() != 4)
260 RMAddr(i
) = R10
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
264 void BX_CPP_AttrRegparmN(1)
265 BX_CPU_C::Resolve64Mod0Base11(bxInstruction_c
*i
)
267 if (i
->sibIndex() != 4)
268 RMAddr(i
) = R11
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
272 void BX_CPP_AttrRegparmN(1)
273 BX_CPU_C::Resolve64Mod0Base12(bxInstruction_c
*i
)
275 if (i
->sibIndex() != 4)
276 RMAddr(i
) = R12
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
280 void BX_CPP_AttrRegparmN(1)
281 BX_CPU_C::Resolve64Mod0Base13(bxInstruction_c
*i
)
283 if (i
->sibIndex() != 4)
284 RMAddr(i
) = R13
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
288 void BX_CPP_AttrRegparmN(1)
289 BX_CPU_C::Resolve64Mod0Base14(bxInstruction_c
*i
)
291 if (i
->sibIndex() != 4)
292 RMAddr(i
) = R14
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
296 void BX_CPP_AttrRegparmN(1)
297 BX_CPU_C::Resolve64Mod0Base15(bxInstruction_c
*i
)
299 if (i
->sibIndex() != 4)
300 RMAddr(i
) = R15
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale());
305 void BX_CPP_AttrRegparmN(1)
306 BX_CPU_C::Resolve64Mod1or2Base0(bxInstruction_c
*i
)
308 if (i
->sibIndex() != 4)
309 RMAddr(i
) = RAX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
311 RMAddr(i
) = RAX
+ (Bit32s
) i
->displ32u();
313 void BX_CPP_AttrRegparmN(1)
314 BX_CPU_C::Resolve64Mod1or2Base1(bxInstruction_c
*i
)
316 if (i
->sibIndex() != 4)
317 RMAddr(i
) = RCX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
319 RMAddr(i
) = RCX
+ (Bit32s
) i
->displ32u();
321 void BX_CPP_AttrRegparmN(1)
322 BX_CPU_C::Resolve64Mod1or2Base2(bxInstruction_c
*i
)
324 if (i
->sibIndex() != 4)
325 RMAddr(i
) = RDX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
327 RMAddr(i
) = RDX
+ (Bit32s
) i
->displ32u();
329 void BX_CPP_AttrRegparmN(1)
330 BX_CPU_C::Resolve64Mod1or2Base3(bxInstruction_c
*i
)
332 if (i
->sibIndex() != 4)
333 RMAddr(i
) = RBX
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
335 RMAddr(i
) = RBX
+ (Bit32s
) i
->displ32u();
337 void BX_CPP_AttrRegparmN(1)
338 BX_CPU_C::Resolve64Mod1or2Base4(bxInstruction_c
*i
)
340 if (i
->sibIndex() != 4)
341 RMAddr(i
) = RSP
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
343 RMAddr(i
) = RSP
+ (Bit32s
) i
->displ32u();
345 void BX_CPP_AttrRegparmN(1)
346 BX_CPU_C::Resolve64Mod1or2Base5(bxInstruction_c
*i
)
348 if (i
->sibIndex() != 4)
349 RMAddr(i
) = RBP
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
351 RMAddr(i
) = RBP
+ (Bit32s
) i
->displ32u();
353 void BX_CPP_AttrRegparmN(1)
354 BX_CPU_C::Resolve64Mod1or2Base6(bxInstruction_c
*i
)
356 if (i
->sibIndex() != 4)
357 RMAddr(i
) = RSI
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
359 RMAddr(i
) = RSI
+ (Bit32s
) i
->displ32u();
361 void BX_CPP_AttrRegparmN(1)
362 BX_CPU_C::Resolve64Mod1or2Base7(bxInstruction_c
*i
)
364 if (i
->sibIndex() != 4)
365 RMAddr(i
) = RDI
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
367 RMAddr(i
) = RDI
+ (Bit32s
) i
->displ32u();
369 void BX_CPP_AttrRegparmN(1)
370 BX_CPU_C::Resolve64Mod1or2Base8(bxInstruction_c
*i
)
372 if (i
->sibIndex() != 4)
373 RMAddr(i
) = R8
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
375 RMAddr(i
) = R8
+ (Bit32s
) i
->displ32u();
377 void BX_CPP_AttrRegparmN(1)
378 BX_CPU_C::Resolve64Mod1or2Base9(bxInstruction_c
*i
)
380 if (i
->sibIndex() != 4)
381 RMAddr(i
) = R9
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
383 RMAddr(i
) = R9
+ (Bit32s
) i
->displ32u();
385 void BX_CPP_AttrRegparmN(1)
386 BX_CPU_C::Resolve64Mod1or2Base10(bxInstruction_c
*i
)
388 if (i
->sibIndex() != 4)
389 RMAddr(i
) = R10
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
391 RMAddr(i
) = R10
+ (Bit32s
) i
->displ32u();
393 void BX_CPP_AttrRegparmN(1)
394 BX_CPU_C::Resolve64Mod1or2Base11(bxInstruction_c
*i
)
396 if (i
->sibIndex() != 4)
397 RMAddr(i
) = R11
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
399 RMAddr(i
) = R11
+ (Bit32s
) i
->displ32u();
401 void BX_CPP_AttrRegparmN(1)
402 BX_CPU_C::Resolve64Mod1or2Base12(bxInstruction_c
*i
)
404 if (i
->sibIndex() != 4)
405 RMAddr(i
) = R12
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
407 RMAddr(i
) = R12
+ (Bit32s
) i
->displ32u();
409 void BX_CPP_AttrRegparmN(1)
410 BX_CPU_C::Resolve64Mod1or2Base13(bxInstruction_c
*i
)
412 if (i
->sibIndex() != 4)
413 RMAddr(i
) = R13
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
415 RMAddr(i
) = R13
+ (Bit32s
) i
->displ32u();
417 void BX_CPP_AttrRegparmN(1)
418 BX_CPU_C::Resolve64Mod1or2Base14(bxInstruction_c
*i
)
420 if (i
->sibIndex() != 4)
421 RMAddr(i
) = R14
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
423 RMAddr(i
) = R14
+ (Bit32s
) i
->displ32u();
425 void BX_CPP_AttrRegparmN(1)
426 BX_CPU_C::Resolve64Mod1or2Base15(bxInstruction_c
*i
)
428 if (i
->sibIndex() != 4)
429 RMAddr(i
) = R15
+ (BX_READ_64BIT_REG(i
->sibIndex()) << i
->sibScale()) + (Bit32s
) i
->displ32u();
431 RMAddr(i
) = R15
+ (Bit32s
) i
->displ32u();
434 #endif /* if BX_SUPPORT_X86_64 */