fetchdecode code duplication cleanup

This commit is contained in:
Stanislav Shwartsman 2010-02-06 17:14:07 +00:00
parent 856e2491ba
commit 4217d76d26
2 changed files with 58 additions and 74 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: fetchdecode.cc,v 1.247 2010-02-06 10:15:26 sshwarts Exp $
// $Id: fetchdecode.cc,v 1.248 2010-02-06 17:14:07 sshwarts Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001-2009 The Bochs Project
@ -2602,25 +2602,6 @@ fetch_b1:
goto modrm_done;
}
seg = sreg_mod1or2_base32[rm];
if (mod == 0x40) { // mod == 01b
if (ilen < remain) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
ilen++;
goto modrm_done;
}
else return(-1);
}
// (mod == 0x80) mod == 10b
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
ilen += 4;
}
else {
return(-1);
}
goto modrm_done;
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
@ -2643,7 +2624,7 @@ fetch_b1:
}
if (mod == 0x00) { // mod==00b, rm==4
seg = sreg_mod0_base32[base];
if (base == 0x05) {
if (base == 5) {
i->setSibBase(BX_NIL_REGISTER);
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
@ -2658,28 +2639,28 @@ fetch_b1:
goto modrm_done;
}
seg = sreg_mod1or2_base32[base];
if (mod == 0x40) { // mod==01b, rm==4
if (ilen < remain) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
ilen++;
goto modrm_done;
}
else {
return(-1);
}
}
if (mod == 0x40) { // mod==01b
if (ilen < remain) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
ilen++;
goto modrm_done;
}
// (mod == 0x80), mod==10b, rm==4
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
ilen += 4;
}
else {
return(-1);
}
goto modrm_done;
}
// (mod == 0x80), mod==10b
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
ilen += 4;
}
else {
return(-1);
}
}
else {
@ -2690,7 +2671,7 @@ fetch_b1:
i->setSibIndex(Resolve16IndexReg[rm]);
if (mod == 0x00) { // mod == 00b
seg = sreg_mod00_rm16[rm];
if (rm == 0x06) {
if (rm == 6) {
i->setSibBase(BX_NIL_REGISTER);
if ((ilen+1) < remain) {
i->modRMForm.displ16u = FetchWORD(iptr);
@ -2710,7 +2691,9 @@ fetch_b1:
ilen++;
goto modrm_done;
}
else return(-1);
else {
return(-1);
}
}
// (mod == 0x80) mod == 10b
if ((ilen+1) < remain) {
@ -2718,7 +2701,9 @@ fetch_b1:
iptr += 2;
ilen += 2;
}
else return(-1);
else {
return(-1);
}
}
modrm_done:

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: fetchdecode64.cc,v 1.249 2010-02-06 10:15:26 sshwarts Exp $
// $Id: fetchdecode64.cc,v 1.250 2010-02-06 17:14:07 sshwarts Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001-2009 The Bochs Project
@ -3512,31 +3512,13 @@ fetch_b1:
if (mod == 0x00) { // mod == 00b
if ((rm & 0x7) == 5) {
i->setSibBase(BX_64BIT_REG_RIP);
get_32bit_displ:
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
ilen += 4;
goto modrm_done;
}
else return(-1);
goto get_32bit_displ;
}
// mod==00b, rm!=4, rm!=5
goto modrm_done;
}
// (mod == 0x40), mod==01b or (mod == 0x80), mod==10b
seg = sreg_mod1or2_base32[rm];
if (mod == 0x40) { // mod == 01b
get_8bit_displ:
if (ilen < remain) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
ilen++;
goto modrm_done;
}
else return(-1);
}
// (mod == 0x80) mod == 10b
goto get_32bit_displ;
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
@ -3566,11 +3548,8 @@ get_8bit_displ:
// mod==00b, rm==4, base!=5
goto modrm_done;
}
// (mod == 0x40), mod==01b or (mod == 0x80), mod==10b
seg = sreg_mod1or2_base32[base];
if (mod == 0x40) // mod==01b, rm==4
goto get_8bit_displ;
// (mod == 0x80), mod==10b, rm==4
goto get_32bit_displ;
}
}
else {
@ -3586,11 +3565,8 @@ get_8bit_displ:
// mod==00b, rm!=4, rm!=5
goto modrm_done;
}
// (mod == 0x40), mod==01b or (mod == 0x80), mod==10b
seg = sreg_mod1or2_base32[rm];
if (mod == 0x40) // mod == 01b
goto get_8bit_displ;
// (mod == 0x80) mod == 10b
goto get_32bit_displ;
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
@ -3620,11 +3596,34 @@ get_8bit_displ:
// mod==00b, rm==4, base!=5
goto modrm_done;
}
// (mod == 0x40), mod==01b or (mod == 0x80), mod==10b
seg = sreg_mod1or2_base32[base];
if (mod == 0x40) // mod==01b, rm==4
goto get_8bit_displ;
// (mod == 0x80), mod==10b, rm==4
goto get_32bit_displ;
}
}
// (mod == 0x40), mod==01b
if (mod == 0x40) {
if (ilen < remain) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
ilen++;
}
else {
return(-1);
}
}
else {
get_32bit_displ:
// (mod == 0x80), mod==10b
if ((ilen+3) < remain) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
ilen += 4;
}
else {
return(-1);
}
}