[prev in list] [next in list] [prev in thread] [next in thread]
List: bochs-cvs
Subject: [Bochs-cvs] CVS: bochs/cpu fetchdecode.cc, 1.272,
From: "Stanislav Shwartsman" <sshwarts () users ! sourceforge ! net>
Date: 2010-05-26 18:34:27
Message-ID: E1OHLQx-0005SP-R1 () sfp-cvsdas-2 ! v30 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Update of /cvsroot/bochs/bochs/cpu
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv19878
Modified Files:
fetchdecode.cc fetchdecode64.cc
Log Message:
optimize for speed
Index: fetchdecode.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode.cc,v
retrieving revision 1.272
retrieving revision 1.273
diff -u -d -r1.272 -r1.273
--- fetchdecode.cc 23 May 2010 19:17:40 -0000 1.272
+++ fetchdecode.cc 26 May 2010 18:34:25 -0000 1.273
@@ -2339,11 +2339,11 @@
int BX_CPP_AttrRegparmN(3)
BX_CPU_C::fetchDecode32(const Bit8u *iptr, bxInstruction_c *i, unsigned remainingInPage)
{
- // remain must be at least 1
- unsigned remain = (remainingInPage < 15) ? remainingInPage : 15;
+ if (remainingInPage > 15) remainingInPage = 15;
+ unsigned remain = remainingInPage; // remain must be at least 1
bx_bool is_32, lock=0;
- unsigned b1, b2, ilen=0, attr, os_32, ia_opcode = 0;
+ unsigned b1, b2, attr, os_32, ia_opcode = 0;
unsigned imm_mode, offset, index = 0;
unsigned rm = 0, mod=0, nnn=0;
unsigned seg = BX_SEG_REG_DS, seg_override = BX_SEG_REG_NULL;
@@ -2365,12 +2365,12 @@
fetch_b1:
b1 = *iptr++;
- ilen++;
+ remain--;
switch (b1) {
case 0x0f: // 2-byte escape
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b1 = 0x100 | *iptr++;
break;
}
@@ -2380,13 +2380,13 @@
offset = os_32 << 9;
if(!sse_prefix) sse_prefix = SSE_PREFIX_66;
i->setOs32B(os_32);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0x67: // AddrSize
i->setAs32B(!is_32);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -2394,7 +2394,7 @@
case 0xf3: // REP/REPE/REPZ
sse_prefix = (b1 & 3) ^ 1;
i->setRepUsed(b1 & 3);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -2403,20 +2403,20 @@
case 0x36: // SS:
case 0x3e: // DS:
seg_override = (b1 >> 3) & 3;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0x64: // FS:
case 0x65: // GS:
seg_override = (b1 & 0xf);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0xf0: // LOCK:
lock = 1;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -2433,8 +2433,8 @@
unsigned b3 = 0;
// handle 3-byte escape
if ((attr & BxGroupX) == Bx3ByteOp) {
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b3 = *iptr++;
}
else
@@ -2442,8 +2442,8 @@
}
// opcode requires modrm byte
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b2 = *iptr++;
}
else
@@ -2482,10 +2482,10 @@
if (mod == 0x00) { // mod == 00b
if (rm == 5) {
i->setSibBase(BX_NIL_REGISTER);
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
- ilen += 4;
+ remain -= 4;
}
else return(-1);
}
@@ -2496,9 +2496,9 @@
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
- if (ilen < remain) {
+ if (remain != 0) {
sib = *iptr++;
- ilen++;
+ remain--;
}
else {
return(-1);
@@ -2516,10 +2516,10 @@
seg = sreg_mod0_base32[base];
if (base == 5) {
i->setSibBase(BX_NIL_REGISTER);
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
@@ -2532,10 +2532,10 @@
}
if (mod == 0x40) { // mod==01b
- if (ilen < remain) {
+ if (remain != 0) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
- ilen++;
+ remain--;
goto modrm_done;
}
else {
@@ -2544,10 +2544,10 @@
}
// (mod == 0x80), mod==10b
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
@@ -2562,10 +2562,10 @@
seg = sreg_mod00_rm16[rm];
if (rm == 6) {
i->setSibBase(BX_NIL_REGISTER);
- if ((ilen+1) < remain) {
+ if (remain > 1) {
i->modRMForm.displ16u = FetchWORD(iptr);
iptr += 2;
- ilen += 2;
+ remain -= 2;
goto modrm_done;
}
else return(-1);
@@ -2574,10 +2574,10 @@
}
seg = sreg_mod01or10_rm16[rm];
if (mod == 0x40) { // mod == 01b
- if (ilen < remain) {
+ if (remain != 0) {
// 8 sign extended to 16
i->modRMForm.displ16u = (Bit8s) *iptr++;
- ilen++;
+ remain--;
goto modrm_done;
}
else {
@@ -2585,10 +2585,10 @@
}
}
// (mod == 0x80) mod == 10b
- if ((ilen+1) < remain) {
+ if (remain > 1) {
i->modRMForm.displ16u = FetchWORD(iptr);
iptr += 2;
- ilen += 2;
+ remain -= 2;
}
else {
return(-1);
@@ -2667,7 +2667,7 @@
// lock prefix not allowed or destination operand is not memory
// mod == 0xc0 can't be BxLockable in fetchdecode tables
if (/*(mod == 0xc0) ||*/ !(attr & BxLockable)) {
- BX_INFO(("LOCK prefix unallowed (op1=0x%x, attr=0x%x, mod=0x%x, nnn=%u)", b1, attr, mod, nnn));
+ BX_INFO(("LOCK prefix unallowed (op1=0x%x, modrm=0x%02x)", b1, b2));
// replace execution function with undefined-opcode
ia_opcode = BX_IA_ERROR;
}
@@ -2681,82 +2681,82 @@
i->modRMForm.Ib = 1;
break;
case BxImmediate_Ib:
- if (ilen < remain) {
+ if (remain != 0) {
i->modRMForm.Ib = *iptr;
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_Ib_SE: // Sign extend to OS size
- if (ilen < remain) {
+ if (remain != 0) {
Bit8s temp8s = *iptr;
if (i->os32L())
i->modRMForm.Id = (Bit32s) temp8s;
else
i->modRMForm.Iw = (Bit16s) temp8s;
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_Iw:
- if ((ilen+1) < remain) {
+ if (remain > 1) {
i->modRMForm.Iw = FetchWORD(iptr);
- ilen += 2;
+ remain -= 2;
}
else {
return(-1);
}
break;
case BxImmediate_Id:
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.Id = FetchDWORD(iptr);
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
}
break;
case BxImmediate_BrOff8:
- if (ilen < remain) {
+ if (remain != 0) {
i->modRMForm.Id = (Bit8s) (*iptr);
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_IwIb:
- if ((ilen+2) < remain) {
+ if (remain > 1) {
i->IxIxForm.Iw = FetchWORD(iptr);
iptr += 2;
i->IxIxForm.Ib2 = *iptr;
- ilen += 3;
+ remain -= 3;
}
else {
return(-1);
}
break;
case BxImmediate_IwIw: // CALL_Ap
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->IxIxForm.Iw = FetchWORD(iptr);
iptr += 2;
i->IxIxForm.Iw2 = FetchWORD(iptr);
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
}
break;
case BxImmediate_IdIw: // CALL_Ap
- if ((ilen+5) < remain) {
+ if (remain > 5) {
i->IxIxForm.Id = FetchDWORD(iptr);
iptr += 4;
i->IxIxForm.Iw2 = FetchWORD(iptr);
- ilen += 6;
+ remain -= 6;
}
else {
return(-1);
@@ -2766,17 +2766,17 @@
// For is which embed the address in the opcode.
if (i->as32L()) {
// fetch 32bit address into Id
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.Id = FetchDWORD(iptr);
- ilen += 4;
+ remain -= 4;
}
else return(-1);
}
else {
// fetch 16bit address into Id
- if ((ilen+1) < remain) {
+ if (remain > 1) {
i->modRMForm.Id = (Bit32u) FetchWORD(iptr);
- ilen += 2;
+ remain -= 2;
}
else return(-1);
}
@@ -2805,7 +2805,7 @@
i->execute2 = BxOpcodesTable[ia_opcode].execute2;
i->setB1(b1);
- i->setILen(ilen);
+ i->setILen(remainingInPage - remain);
i->setIaOpcode(ia_opcode);
#if BX_SUPPORT_TRACE_CACHE
Index: fetchdecode64.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/cpu/fetchdecode64.cc,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -d -r1.267 -r1.268
--- fetchdecode64.cc 23 May 2010 19:17:40 -0000 1.267
+++ fetchdecode64.cc 26 May 2010 18:34:25 -0000 1.268
@@ -3240,10 +3240,10 @@
int BX_CPP_AttrRegparmN(3)
BX_CPU_C::fetchDecode64(const Bit8u *iptr, bxInstruction_c *i, unsigned remainingInPage)
{
- // remain must be at least 1
- unsigned remain = (remainingInPage < 15) ? remainingInPage : 15;
+ if (remainingInPage > 15) remainingInPage = 15;
- unsigned b1, b2, ilen=0, attr, lock=0, ia_opcode = 0;
+ unsigned remain = remainingInPage; // remain must be at least 1
+ unsigned b1, b2, attr, lock=0, ia_opcode = 0;
unsigned imm_mode, offset = 512, rex_r = 0, rex_x = 0, rex_b = 0;
unsigned rm = 0, mod = 0, nnn = 0, index = 0;
unsigned seg = BX_SEG_REG_DS, seg_override = BX_SEG_REG_NULL;
@@ -3263,7 +3263,7 @@
fetch_b1:
b1 = *iptr++;
- ilen++;
+ remain--;
switch (b1) {
case 0x40:
@@ -3283,13 +3283,13 @@
case 0x4E:
case 0x4F:
rex_prefix = b1;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0x0f: // 2 byte escape
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b1 = 0x100 | *iptr++;
break;
}
@@ -3299,7 +3299,7 @@
rex_prefix = 0;
sse_prefix = (b1 & 3) ^ 1;
i->setRepUsed(b1 & 3);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -3309,7 +3309,7 @@
case 0x3e: // DS:
/* ignore segment override prefix */
rex_prefix = 0;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -3317,7 +3317,7 @@
case 0x65: // GS:
rex_prefix = 0;
seg_override = b1 & 0xf;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -3326,21 +3326,21 @@
if(!sse_prefix) sse_prefix = SSE_PREFIX_66;
i->setOs32B(0);
offset = 0;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0x67: // AddrSize
rex_prefix = 0;
i->setAs64B(0);
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
case 0xf0: // LOCK:
rex_prefix = 0;
lock = 1;
- if (ilen < remain) {
+ if (remain != 0) {
goto fetch_b1;
}
return(-1);
@@ -3369,8 +3369,8 @@
unsigned b3 = 0;
// handle 3-byte escape
if ((attr & BxGroupX) == Bx3ByteOp) {
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b3 = *iptr++;
}
else
@@ -3378,8 +3378,8 @@
}
// opcode requires modrm byte
- if (ilen < remain) {
- ilen++;
+ if (remain != 0) {
+ remain--;
b2 = *iptr++;
}
else
@@ -3428,9 +3428,9 @@
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
- if (ilen < remain) {
+ if (remain != 0) {
sib = *iptr++;
- ilen++;
+ remain--;
}
else {
return(-1);
@@ -3474,9 +3474,9 @@
}
else { // mod!=11b, rm==4, s-i-b byte follows
unsigned sib, base, index, scale;
- if (ilen < remain) {
+ if (remain != 0) {
sib = *iptr++;
- ilen++;
+ remain--;
}
else {
return(-1);
@@ -3506,10 +3506,10 @@
// (mod == 0x40), mod==01b
if (mod == 0x40) {
- if (ilen < remain) {
+ if (remain != 0) {
// 8 sign extended to 32
i->modRMForm.displ32u = (Bit8s) *iptr++;
- ilen++;
+ remain--;
}
else {
return(-1);
@@ -3520,10 +3520,10 @@
get_32bit_displ:
// (mod == 0x80), mod==10b
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.displ32u = FetchDWORD(iptr);
iptr += 4;
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
@@ -3607,7 +3607,7 @@
// lock prefix not allowed or destination operand is not memory
// mod == 0xc0 can't be BxLockable in fetchdecode tables
if (/*(mod == 0xc0) ||*/ !(attr & BxLockable)) {
- BX_INFO(("LOCK prefix unallowed (op1=0x%x, mod=%u, nnn=%u)", b1, mod, nnn));
+ BX_INFO(("LOCK prefix unallowed (op1=0x%x, modrm=0x%02x)", b1, b2));
// replace execution function with undefined-opcode
ia_opcode = BX_IA_ERROR;
}
@@ -3621,69 +3621,69 @@
i->modRMForm.Ib = 1;
break;
case BxImmediate_Ib:
- if (ilen < remain) {
+ if (remain != 0) {
i->modRMForm.Ib = *iptr;
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_Ib_SE: // Sign extend to OS size
- if (ilen < remain) {
+ if (remain != 0) {
Bit8s temp8s = *iptr;
if (i->os32L())
i->modRMForm.Id = (Bit32s) temp8s;
else
i->modRMForm.Iw = (Bit16s) temp8s;
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_Iw:
- if ((ilen+1) < remain) {
+ if (remain > 1) {
i->modRMForm.Iw = FetchWORD(iptr);
- ilen += 2;
+ remain -= 2;
}
else {
return(-1);
}
break;
case BxImmediate_Id:
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->modRMForm.Id = FetchDWORD(iptr);
- ilen += 4;
+ remain -= 4;
}
else {
return(-1);
}
break;
case BxImmediate_Iq: // MOV Rx,imm64
- if ((ilen+7) < remain) {
+ if (remain > 7) {
i->IqForm.Iq = FetchQWORD(iptr);
- ilen += 8;
+ remain -= 8;
}
else {
return(-1);
}
break;
case BxImmediate_BrOff8:
- if (ilen < remain) {
+ if (remain != 0) {
i->modRMForm.Id = (Bit8s) (*iptr);
- ilen++;
+ remain--;
}
else {
return(-1);
}
break;
case BxImmediate_IwIb:
- if ((ilen+2) < remain) {
+ if (remain > 2) {
i->IxIxForm.Iw = FetchWORD(iptr);
iptr += 2;
i->IxIxForm.Ib2 = *iptr;
- ilen += 3;
+ remain -= 3;
}
else return(-1);
break;
@@ -3691,16 +3691,16 @@
// For is which embed the address in the opcode. Note
// there is only 64/32-bit addressing available in long-mode.
if (i->as64L()) {
- if ((ilen+7) < remain) {
+ if (remain > 7) {
i->IqForm.Iq = FetchQWORD(iptr);
- ilen += 8;
+ remain -= 8;
}
else return(-1);
}
else { // as32
- if ((ilen+3) < remain) {
+ if (remain > 3) {
i->IqForm.Iq = (Bit64u) FetchDWORD(iptr);
- ilen += 4;
+ remain -= 4;
}
else return(-1);
}
@@ -3729,7 +3729,7 @@
i->execute2 = BxOpcodesTable[ia_opcode].execute2;
i->setB1(b1);
- i->setILen(ilen);
+ i->setILen(remainingInPage - remain);
i->setIaOpcode(ia_opcode);
#if BX_SUPPORT_TRACE_CACHE
------------------------------------------------------------------------------
_______________________________________________
Bochs-cvs mailing list
Bochs-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bochs-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic