From edfff23ca0b8b847816ef0dbdb787d77cdc12990 Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Mon, 12 Nov 2007 18:20:15 +0000 Subject: [PATCH] Split JCC methods to 16 different methods per branch condition --- bochs/cpu/cpu.cc | 10 +- bochs/cpu/cpu.h | 55 ++++++++- bochs/cpu/ctrl_xfer16.cc | 226 ++++++++++++++++++++++++++++++++----- bochs/cpu/ctrl_xfer32.cc | 210 +++++++++++++++++++++++++++++----- bochs/cpu/ctrl_xfer64.cc | 198 +++++++++++++++++++++++++++----- bochs/cpu/fetchdecode.cc | 116 +++++++++---------- bochs/cpu/fetchdecode64.cc | 173 ++++++++++++++-------------- bochs/cpu/resolve16.cc | 8 +- 8 files changed, 757 insertions(+), 239 deletions(-) diff --git a/bochs/cpu/cpu.cc b/bochs/cpu/cpu.cc index a51526513..569a9d943 100644 --- a/bochs/cpu/cpu.cc +++ b/bochs/cpu/cpu.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cpu.cc,v 1.179 2007-11-01 20:43:52 sshwarts Exp $ +// $Id: cpu.cc,v 1.180 2007-11-12 18:20:05 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -245,10 +245,8 @@ void BX_CPU_C::cpu_loop(Bit32u max_instr_count) // fetch and decode next instruction bxInstruction_c *i = fetchInstruction(&iStorage, eipBiased); - BxExecutePtr_tR resolveModRM = i->ResolveModrm; // Get as soon as possible for speculation - BxExecutePtr_t execute = i->execute; // fetch as soon as possible for speculation - if (resolveModRM) - BX_CPU_CALL_METHODR(resolveModRM, (i)); + + BX_CPU_CALL_METHODR(i->ResolveModrm, (i)); // An instruction will have been fetched using either the normal case, // or the boundary fetch (across pages), by this point. @@ -272,7 +270,7 @@ void BX_CPU_C::cpu_loop(Bit32u max_instr_count) // decoding instruction compeleted -> continue with execution BX_INSTR_BEFORE_EXECUTION(BX_CPU_ID, i); RIP += i->ilen(); - BX_CPU_CALL_METHOD(execute, (i)); // might iterate repeat instruction + BX_CPU_CALL_METHOD(i->execute, (i)); // might iterate repeat instruction BX_CPU_THIS_PTR prev_eip = RIP; // commit new RIP BX_CPU_THIS_PTR prev_esp = RSP; // commit new RSP BX_INSTR_AFTER_EXECUTION(BX_CPU_ID, i); diff --git a/bochs/cpu/cpu.h b/bochs/cpu/cpu.h index 3e641836f..d8a4c9136 100644 --- a/bochs/cpu/cpu.h +++ b/bochs/cpu/cpu.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cpu.h,v 1.353 2007-11-11 21:26:10 sshwarts Exp $ +// $Id: cpu.h,v 1.354 2007-11-12 18:20:07 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -1637,12 +1637,39 @@ public: // for now... BX_SMF void MOV_TdRd(bxInstruction_c *); BX_SMF void MOV_RdTd(bxInstruction_c *); - BX_SMF void JCC_Jd(bxInstruction_c *); - BX_SMF void JCC_Jw(bxInstruction_c *); - BX_SMF void JZ_Jd(bxInstruction_c *); + BX_SMF void JO_Jw(bxInstruction_c *); + BX_SMF void JNO_Jw(bxInstruction_c *); + BX_SMF void JB_Jw(bxInstruction_c *); + BX_SMF void JNB_Jw(bxInstruction_c *); BX_SMF void JZ_Jw(bxInstruction_c *); - BX_SMF void JNZ_Jd(bxInstruction_c *); BX_SMF void JNZ_Jw(bxInstruction_c *); + BX_SMF void JBE_Jw(bxInstruction_c *); + BX_SMF void JNBE_Jw(bxInstruction_c *); + BX_SMF void JS_Jw(bxInstruction_c *); + BX_SMF void JNS_Jw(bxInstruction_c *); + BX_SMF void JP_Jw(bxInstruction_c *); + BX_SMF void JNP_Jw(bxInstruction_c *); + BX_SMF void JL_Jw(bxInstruction_c *); + BX_SMF void JNL_Jw(bxInstruction_c *); + BX_SMF void JLE_Jw(bxInstruction_c *); + BX_SMF void JNLE_Jw(bxInstruction_c *); + + BX_SMF void JO_Jd(bxInstruction_c *); + BX_SMF void JNO_Jd(bxInstruction_c *); + BX_SMF void JB_Jd(bxInstruction_c *); + BX_SMF void JNB_Jd(bxInstruction_c *); + BX_SMF void JZ_Jd(bxInstruction_c *); + BX_SMF void JNZ_Jd(bxInstruction_c *); + BX_SMF void JBE_Jd(bxInstruction_c *); + BX_SMF void JNBE_Jd(bxInstruction_c *); + BX_SMF void JS_Jd(bxInstruction_c *); + BX_SMF void JNS_Jd(bxInstruction_c *); + BX_SMF void JP_Jd(bxInstruction_c *); + BX_SMF void JNP_Jd(bxInstruction_c *); + BX_SMF void JL_Jd(bxInstruction_c *); + BX_SMF void JNL_Jd(bxInstruction_c *); + BX_SMF void JLE_Jd(bxInstruction_c *); + BX_SMF void JNLE_Jd(bxInstruction_c *); BX_SMF void SETO_Eb(bxInstruction_c *); BX_SMF void SETNO_Eb(bxInstruction_c *); @@ -2560,9 +2587,23 @@ public: // for now... BX_SMF void CALL_Jq(bxInstruction_c *); BX_SMF void JMP_Jq(bxInstruction_c *); - BX_SMF void JCC_Jq(bxInstruction_c *); + + BX_SMF void JO_Jq(bxInstruction_c *); + BX_SMF void JNO_Jq(bxInstruction_c *); + BX_SMF void JB_Jq(bxInstruction_c *); + BX_SMF void JNB_Jq(bxInstruction_c *); BX_SMF void JZ_Jq(bxInstruction_c *); BX_SMF void JNZ_Jq(bxInstruction_c *); + BX_SMF void JBE_Jq(bxInstruction_c *); + BX_SMF void JNBE_Jq(bxInstruction_c *); + BX_SMF void JS_Jq(bxInstruction_c *); + BX_SMF void JNS_Jq(bxInstruction_c *); + BX_SMF void JP_Jq(bxInstruction_c *); + BX_SMF void JNP_Jq(bxInstruction_c *); + BX_SMF void JL_Jq(bxInstruction_c *); + BX_SMF void JNL_Jq(bxInstruction_c *); + BX_SMF void JLE_Jq(bxInstruction_c *); + BX_SMF void JNLE_Jq(bxInstruction_c *); BX_SMF void MOV_CqRq(bxInstruction_c *); BX_SMF void MOV_DqRq(bxInstruction_c *); @@ -2696,6 +2737,8 @@ public: // for now... BX_SMF void UndefinedOpcode(bxInstruction_c *); BX_SMF void BxError(bxInstruction_c *i); + BX_SMF void ResolveDummy(bxInstruction_c *) BX_CPP_AttrRegparmN(1); + BX_SMF void Resolve16Mod0Rm0(bxInstruction_c *) BX_CPP_AttrRegparmN(1); BX_SMF void Resolve16Mod0Rm1(bxInstruction_c *) BX_CPP_AttrRegparmN(1); BX_SMF void Resolve16Mod0Rm2(bxInstruction_c *) BX_CPP_AttrRegparmN(1); diff --git a/bochs/cpu/ctrl_xfer16.cc b/bochs/cpu/ctrl_xfer16.cc index 8333510fb..a3295bd7a 100644 --- a/bochs/cpu/ctrl_xfer16.cc +++ b/bochs/cpu/ctrl_xfer16.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: ctrl_xfer16.cc,v 1.39 2007-10-22 17:41:41 sshwarts Exp $ +// $Id: ctrl_xfer16.cc,v 1.40 2007-11-12 18:20:09 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -272,33 +272,54 @@ void BX_CPU_C::JMP_Jw(bxInstruction_c *i) BX_INSTR_UCNEAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_JMP, new_EIP); } -void BX_CPU_C::JCC_Jw(bxInstruction_c *i) +void BX_CPU_C::JO_Jw(bxInstruction_c *i) { - bx_bool condition; - - switch (i->b1() & 0x0f) { - case 0x00: /* JO */ condition = get_OF(); break; - case 0x01: /* JNO */ condition = !get_OF(); break; - case 0x02: /* JB */ condition = get_CF(); break; - case 0x03: /* JNB */ condition = !get_CF(); break; - case 0x04: /* JZ */ condition = get_ZF(); break; - case 0x05: /* JNZ */ condition = !get_ZF(); break; - case 0x06: /* JBE */ condition = get_CF() || get_ZF(); break; - case 0x07: /* JNBE */ condition = !get_CF() && !get_ZF(); break; - case 0x08: /* JS */ condition = get_SF(); break; - case 0x09: /* JNS */ condition = !get_SF(); break; - case 0x0A: /* JP */ condition = get_PF(); break; - case 0x0B: /* JNP */ condition = !get_PF(); break; - case 0x0C: /* JL */ condition = getB_SF() != getB_OF(); break; - case 0x0D: /* JNL */ condition = getB_SF() == getB_OF(); break; - case 0x0E: /* JLE */ condition = get_ZF() || (getB_SF() != getB_OF()); break; - case 0x0F: /* JNLE */ condition = (getB_SF() == getB_OF()) && !get_ZF(); break; - default: - condition = 0; // For compiler...all targets should set condition. - break; + if (get_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} - if (condition) { +void BX_CPU_C::JNO_Jw(bxInstruction_c *i) +{ + if (! get_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JB_Jw(bxInstruction_c *i) +{ + if (get_CF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNB_Jw(bxInstruction_c *i) +{ + if (! get_CF()) { Bit32u new_EIP = EIP + (Bit32s) i->Id(); new_EIP &= 0x0000ffff; branch_near32(new_EIP); @@ -328,7 +349,157 @@ void BX_CPU_C::JZ_Jw(bxInstruction_c *i) void BX_CPU_C::JNZ_Jw(bxInstruction_c *i) { - if (!get_ZF()) { + if (! get_ZF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JBE_Jw(bxInstruction_c *i) +{ + if (get_CF() || get_ZF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNBE_Jw(bxInstruction_c *i) +{ + if (! (get_CF() || get_ZF())) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JS_Jw(bxInstruction_c *i) +{ + if (get_SF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNS_Jw(bxInstruction_c *i) +{ + if (! get_SF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JP_Jw(bxInstruction_c *i) +{ + if (get_PF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNP_Jw(bxInstruction_c *i) +{ + if (! get_PF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JL_Jw(bxInstruction_c *i) +{ + if (getB_SF() != getB_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNL_Jw(bxInstruction_c *i) +{ + if (getB_SF() == getB_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JLE_Jw(bxInstruction_c *i) +{ + if (get_ZF() || (getB_SF() != getB_OF())) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + new_EIP &= 0x0000ffff; + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNLE_Jw(bxInstruction_c *i) +{ + if (! get_ZF() && (getB_SF() == getB_OF())) { Bit32u new_EIP = EIP + (Bit32s) i->Id(); new_EIP &= 0x0000ffff; branch_near32(new_EIP); @@ -357,8 +528,7 @@ void BX_CPU_C::JMP_Ew(bxInstruction_c *i) BX_INSTR_UCNEAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_JMP, new_EIP); } - /* Far indirect jump */ - +/* Far indirect jump */ void BX_CPU_C::JMP16_Ep(bxInstruction_c *i) { Bit16u cs_raw; diff --git a/bochs/cpu/ctrl_xfer32.cc b/bochs/cpu/ctrl_xfer32.cc index 13455f138..d6b453216 100644 --- a/bochs/cpu/ctrl_xfer32.cc +++ b/bochs/cpu/ctrl_xfer32.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: ctrl_xfer32.cc,v 1.51 2007-10-22 17:41:41 sshwarts Exp $ +// $Id: ctrl_xfer32.cc,v 1.52 2007-11-12 18:20:10 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -246,33 +246,51 @@ void BX_CPU_C::JMP_Jd(bxInstruction_c *i) BX_INSTR_UCNEAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_JMP, new_EIP); } -void BX_CPU_C::JCC_Jd(bxInstruction_c *i) +void BX_CPU_C::JO_Jd(bxInstruction_c *i) { - bx_bool condition; + if (get_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} - switch (i->b1() & 0x0f) { - case 0x00: /* JO */ condition = get_OF(); break; - case 0x01: /* JNO */ condition = !get_OF(); break; - case 0x02: /* JB */ condition = get_CF(); break; - case 0x03: /* JNB */ condition = !get_CF(); break; - case 0x04: /* JZ */ condition = get_ZF(); break; - case 0x05: /* JNZ */ condition = !get_ZF(); break; - case 0x06: /* JBE */ condition = get_CF() || get_ZF(); break; - case 0x07: /* JNBE */ condition = !get_CF() && !get_ZF(); break; - case 0x08: /* JS */ condition = get_SF(); break; - case 0x09: /* JNS */ condition = !get_SF(); break; - case 0x0A: /* JP */ condition = get_PF(); break; - case 0x0B: /* JNP */ condition = !get_PF(); break; - case 0x0C: /* JL */ condition = getB_SF() != getB_OF(); break; - case 0x0D: /* JNL */ condition = getB_SF() == getB_OF(); break; - case 0x0E: /* JLE */ condition = get_ZF() || (getB_SF() != getB_OF()); break; - case 0x0F: /* JNLE */ condition = (getB_SF() == getB_OF()) && !get_ZF(); break; - default: - condition = 0; // For compiler...all targets should set condition. - break; - } +void BX_CPU_C::JNO_Jd(bxInstruction_c *i) +{ + if (! get_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} - if (condition) { +void BX_CPU_C::JB_Jd(bxInstruction_c *i) +{ + if (get_CF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNB_Jd(bxInstruction_c *i) +{ + if (! get_CF()) { Bit32u new_EIP = EIP + (Bit32s) i->Id(); branch_near32(new_EIP); BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); @@ -300,7 +318,147 @@ void BX_CPU_C::JZ_Jd(bxInstruction_c *i) void BX_CPU_C::JNZ_Jd(bxInstruction_c *i) { - if (!get_ZF()) { + if (! get_ZF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JBE_Jd(bxInstruction_c *i) +{ + if (get_CF() || get_ZF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNBE_Jd(bxInstruction_c *i) +{ + if (! (get_CF() || get_ZF())) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JS_Jd(bxInstruction_c *i) +{ + if (get_SF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNS_Jd(bxInstruction_c *i) +{ + if (! get_SF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JP_Jd(bxInstruction_c *i) +{ + if (get_PF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNP_Jd(bxInstruction_c *i) +{ + if (! get_PF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JL_Jd(bxInstruction_c *i) +{ + if (getB_SF() != getB_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNL_Jd(bxInstruction_c *i) +{ + if (getB_SF() == getB_OF()) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JLE_Jd(bxInstruction_c *i) +{ + if (get_ZF() || (getB_SF() != getB_OF())) { + Bit32u new_EIP = EIP + (Bit32s) i->Id(); + branch_near32(new_EIP); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNLE_Jd(bxInstruction_c *i) +{ + if (! get_ZF() && (getB_SF() == getB_OF())) { Bit32u new_EIP = EIP + (Bit32s) i->Id(); branch_near32(new_EIP); BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, new_EIP); diff --git a/bochs/cpu/ctrl_xfer64.cc b/bochs/cpu/ctrl_xfer64.cc index f55adc5bb..043a463bf 100644 --- a/bochs/cpu/ctrl_xfer64.cc +++ b/bochs/cpu/ctrl_xfer64.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: ctrl_xfer64.cc,v 1.51 2007-11-11 21:26:10 sshwarts Exp $ +// $Id: ctrl_xfer64.cc,v 1.52 2007-11-12 18:20:10 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -195,36 +195,48 @@ void BX_CPU_C::JMP_Jq(bxInstruction_c *i) BX_INSTR_UCNEAR_BRANCH(BX_CPU_ID, BX_INSTR_IS_JMP, RIP); } -void BX_CPU_C::JCC_Jq(bxInstruction_c *i) +void BX_CPU_C::JO_Jq(bxInstruction_c *i) { - bx_bool condition; - - switch (i->b1() & 0x0f) { - case 0x00: /* JO */ condition = get_OF(); break; - case 0x01: /* JNO */ condition = !get_OF(); break; - case 0x02: /* JB */ condition = get_CF(); break; - case 0x03: /* JNB */ condition = !get_CF(); break; - case 0x04: /* JZ */ condition = get_ZF(); break; - case 0x05: /* JNZ */ condition = !get_ZF(); break; - case 0x06: /* JBE */ condition = get_CF() || get_ZF(); break; - case 0x07: /* JNBE */ condition = !get_CF() && !get_ZF(); break; - case 0x08: /* JS */ condition = get_SF(); break; - case 0x09: /* JNS */ condition = !get_SF(); break; - case 0x0A: /* JP */ condition = get_PF(); break; - case 0x0B: /* JNP */ condition = !get_PF(); break; - case 0x0C: /* JL */ condition = getB_SF() != getB_OF(); break; - case 0x0D: /* JNL */ condition = getB_SF() == getB_OF(); break; - case 0x0E: /* JLE */ condition = get_ZF() || (getB_SF() != getB_OF()); - break; - case 0x0F: /* JNLE */ condition = (getB_SF() == getB_OF()) && - !get_ZF(); - break; - default: - condition = 0; // For compiler...all targets should set condition. - break; + if (get_OF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} - if (condition) { +void BX_CPU_C::JNO_Jq(bxInstruction_c *i) +{ + if (! get_OF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JB_Jq(bxInstruction_c *i) +{ + if (get_CF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNB_Jq(bxInstruction_c *i) +{ + if (! get_CF()) { branch_near64(i); BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); } @@ -261,6 +273,136 @@ void BX_CPU_C::JNZ_Jq(bxInstruction_c *i) #endif } +void BX_CPU_C::JBE_Jq(bxInstruction_c *i) +{ + if (get_CF() || get_ZF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNBE_Jq(bxInstruction_c *i) +{ + if (! (get_CF() || get_ZF())) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JS_Jq(bxInstruction_c *i) +{ + if (get_SF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNS_Jq(bxInstruction_c *i) +{ + if (! get_SF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JP_Jq(bxInstruction_c *i) +{ + if (get_PF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNP_Jq(bxInstruction_c *i) +{ + if (! get_PF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JL_Jq(bxInstruction_c *i) +{ + if (getB_SF() != getB_OF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNL_Jq(bxInstruction_c *i) +{ + if (getB_SF() == getB_OF()) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JLE_Jq(bxInstruction_c *i) +{ + if (get_ZF() || (getB_SF() != getB_OF())) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + +void BX_CPU_C::JNLE_Jq(bxInstruction_c *i) +{ + if (! get_ZF() && (getB_SF() == getB_OF())) { + branch_near64(i); + BX_INSTR_CNEAR_BRANCH_TAKEN(BX_CPU_ID, RIP); + } +#if BX_INSTRUMENTATION + else { + BX_INSTR_CNEAR_BRANCH_NOT_TAKEN(BX_CPU_ID); + } +#endif +} + void BX_CPU_C::JMP_Eq(bxInstruction_c *i) { Bit64u op1_64; diff --git a/bochs/cpu/fetchdecode.cc b/bochs/cpu/fetchdecode.cc index 6bc4e5f84..efb88e351 100644 --- a/bochs/cpu/fetchdecode.cc +++ b/bochs/cpu/fetchdecode.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: fetchdecode.cc,v 1.116 2007-11-11 20:56:22 sshwarts Exp $ +// $Id: fetchdecode.cc,v 1.117 2007-11-12 18:20:10 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -523,22 +523,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo[512*2] = { /* 6D */ { 0, &BX_CPU_C::REP_INSW_YwDX }, /* 6E */ { 0, &BX_CPU_C::REP_OUTSB_DXXb }, /* 6F */ { 0, &BX_CPU_C::REP_OUTSW_DXXw }, - /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, + /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JO_Jw }, + /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JNO_Jw }, + /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JB_Jw }, + /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JNB_Jw }, /* 74 */ { BxImmediate_BrOff8, &BX_CPU_C::JZ_Jw }, /* 75 */ { BxImmediate_BrOff8, &BX_CPU_C::JNZ_Jw }, - /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, - /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jw }, + /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JBE_Jw }, + /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JNBE_Jw }, + /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JS_Jw }, + /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JNS_Jw }, + /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JP_Jw }, + /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JNP_Jw }, + /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JL_Jw }, + /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JNL_Jw }, + /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JLE_Jw }, + /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JNLE_Jw }, /* 80 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfoG1EbIb }, /* 81 */ { BxAnother | BxGroup1 | BxImmediate_Iv, NULL, BxOpcodeInfoG1Ew }, /* 82 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfoG1EbIb }, @@ -839,22 +839,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo[512*2] = { /* 0F 7D */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7d }, /* 0F 7E */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7e }, /* 0F 7F */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7f }, - /* 0F 80 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 81 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 82 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 83 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, + /* 0F 80 */ { BxImmediate_BrOff16, &BX_CPU_C::JO_Jw }, + /* 0F 81 */ { BxImmediate_BrOff16, &BX_CPU_C::JNO_Jw }, + /* 0F 82 */ { BxImmediate_BrOff16, &BX_CPU_C::JB_Jw }, + /* 0F 83 */ { BxImmediate_BrOff16, &BX_CPU_C::JNB_Jw }, /* 0F 84 */ { BxImmediate_BrOff16, &BX_CPU_C::JZ_Jw }, /* 0F 85 */ { BxImmediate_BrOff16, &BX_CPU_C::JNZ_Jw }, - /* 0F 86 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 87 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 88 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 89 */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8A */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8B */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8C */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8D */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8E */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, - /* 0F 8F */ { BxImmediate_BrOff16, &BX_CPU_C::JCC_Jw }, + /* 0F 86 */ { BxImmediate_BrOff16, &BX_CPU_C::JBE_Jw }, + /* 0F 87 */ { BxImmediate_BrOff16, &BX_CPU_C::JNBE_Jw }, + /* 0F 88 */ { BxImmediate_BrOff16, &BX_CPU_C::JS_Jw }, + /* 0F 89 */ { BxImmediate_BrOff16, &BX_CPU_C::JNS_Jw }, + /* 0F 8A */ { BxImmediate_BrOff16, &BX_CPU_C::JP_Jw }, + /* 0F 8B */ { BxImmediate_BrOff16, &BX_CPU_C::JNP_Jw }, + /* 0F 8C */ { BxImmediate_BrOff16, &BX_CPU_C::JL_Jw }, + /* 0F 8D */ { BxImmediate_BrOff16, &BX_CPU_C::JNL_Jw }, + /* 0F 8E */ { BxImmediate_BrOff16, &BX_CPU_C::JLE_Jw }, + /* 0F 8F */ { BxImmediate_BrOff16, &BX_CPU_C::JNLE_Jw }, /* 0F 90 */ { BxAnother, &BX_CPU_C::SETO_Eb }, /* 0F 91 */ { BxAnother, &BX_CPU_C::SETNO_Eb }, /* 0F 92 */ { BxAnother, &BX_CPU_C::SETB_Eb }, @@ -1081,22 +1081,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo[512*2] = { /* 6D */ { 0, &BX_CPU_C::REP_INSD_YdDX }, /* 6E */ { 0, &BX_CPU_C::REP_OUTSB_DXXb }, /* 6F */ { 0, &BX_CPU_C::REP_OUTSD_DXXd }, - /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, + /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JO_Jd }, + /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JNO_Jd }, + /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JB_Jd }, + /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JNB_Jd }, /* 74 */ { BxImmediate_BrOff8, &BX_CPU_C::JZ_Jd }, /* 75 */ { BxImmediate_BrOff8, &BX_CPU_C::JNZ_Jd }, - /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, - /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jd }, + /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JBE_Jd }, + /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JNBE_Jd }, + /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JS_Jd }, + /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JNS_Jd }, + /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JP_Jd }, + /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JNP_Jd }, + /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JL_Jd }, + /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JNL_Jd }, + /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JLE_Jd }, + /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JNLE_Jd }, /* 80 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfoG1EbIb }, /* 81 */ { BxAnother | BxGroup1 | BxImmediate_Iv, NULL, BxOpcodeInfoG1Ed }, /* 82 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfoG1EbIb }, @@ -1397,22 +1397,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo[512*2] = { /* 0F 7D */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7d }, /* 0F 7E */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7e }, /* 0F 7F */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7f }, - /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, + /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JO_Jd }, + /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JNO_Jd }, + /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JB_Jd }, + /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JNB_Jd }, /* 0F 84 */ { BxImmediate_BrOff32, &BX_CPU_C::JZ_Jd }, /* 0F 85 */ { BxImmediate_BrOff32, &BX_CPU_C::JNZ_Jd }, - /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, - /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jd }, + /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JBE_Jd }, + /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JNBE_Jd }, + /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JS_Jd }, + /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JNS_Jd }, + /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JP_Jd }, + /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JNP_Jd }, + /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JL_Jd }, + /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JNL_Jd }, + /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JLE_Jd }, + /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JNLE_Jd }, /* 0F 90 */ { BxAnother, &BX_CPU_C::SETO_Eb }, /* 0F 91 */ { BxAnother, &BX_CPU_C::SETNO_Eb }, /* 0F 92 */ { BxAnother, &BX_CPU_C::SETB_Eb }, @@ -1549,7 +1549,7 @@ BX_CPU_C::fetchDecode32(Bit8u *iptr, bxInstruction_c *instruction, unsigned rema os_32 = is_32 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.d_b; - instruction->ResolveModrm = NULL; + instruction->ResolveModrm = ResolveDummy; instruction->initMetaInfo(/*os32*/ is_32, /*as32*/ is_32, /*os64*/ 0, /*as64*/ 0); diff --git a/bochs/cpu/fetchdecode64.cc b/bochs/cpu/fetchdecode64.cc index 4bcdbd0c1..5ab1a0993 100644 --- a/bochs/cpu/fetchdecode64.cc +++ b/bochs/cpu/fetchdecode64.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: fetchdecode64.cc,v 1.122 2007-11-11 21:26:10 sshwarts Exp $ +// $Id: fetchdecode64.cc,v 1.123 2007-11-12 18:20:12 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -667,22 +667,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 6D */ { 0, &BX_CPU_C::REP_INSW_YwDX }, /* 6E */ { 0, &BX_CPU_C::REP_OUTSB_DXXb }, /* 6F */ { 0, &BX_CPU_C::REP_OUTSW_DXXw }, - /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JO_Jq }, + /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JNO_Jq }, + /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JB_Jq }, + /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JNB_Jq }, /* 74 */ { BxImmediate_BrOff8, &BX_CPU_C::JZ_Jq }, /* 75 */ { BxImmediate_BrOff8, &BX_CPU_C::JNZ_Jq }, - /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JBE_Jq }, + /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JNBE_Jq }, + /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JS_Jq }, + /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JNS_Jq }, + /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JP_Jq }, + /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JNP_Jq }, + /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JL_Jq }, + /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JNL_Jq }, + /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JLE_Jq }, + /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JNLE_Jq }, /* 80 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfo64G1EbIb }, /* 81 */ { BxAnother | BxGroup1 | BxImmediate_Iv, NULL, BxOpcodeInfo64G1Ew }, /* 82 */ { 0, &BX_CPU_C::BxError }, @@ -954,22 +954,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 0F 7D */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7d }, /* 0F 7E */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7e }, /* 0F 7F */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7f }, - /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JO_Jq }, + /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JNO_Jq }, + /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JB_Jq }, + /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JNB_Jq }, /* 0F 84 */ { BxImmediate_BrOff32, &BX_CPU_C::JZ_Jq }, /* 0F 85 */ { BxImmediate_BrOff32, &BX_CPU_C::JNZ_Jq }, - /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JBE_Jq }, + /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JNBE_Jq }, + /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JS_Jq }, + /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JNS_Jq }, + /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JP_Jq }, + /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JNP_Jq }, + /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JL_Jq }, + /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JNL_Jq }, + /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JLE_Jq }, + /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JNLE_Jq }, /* 0F 90 */ { BxAnother, &BX_CPU_C::SETO_Eb }, /* 0F 91 */ { BxAnother, &BX_CPU_C::SETNO_Eb }, /* 0F 92 */ { BxAnother, &BX_CPU_C::SETB_Eb }, @@ -1196,22 +1196,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 6D */ { 0, &BX_CPU_C::REP_INSD_YdDX }, /* 6E */ { 0, &BX_CPU_C::REP_OUTSB_DXXb }, /* 6F */ { 0, &BX_CPU_C::REP_OUTSD_DXXd }, - /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JO_Jq }, + /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JNO_Jq }, + /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JB_Jq }, + /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JNB_Jq }, /* 74 */ { BxImmediate_BrOff8, &BX_CPU_C::JZ_Jq }, /* 75 */ { BxImmediate_BrOff8, &BX_CPU_C::JNZ_Jq }, - /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JBE_Jq }, + /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JNBE_Jq }, + /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JS_Jq }, + /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JNS_Jq }, + /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JP_Jq }, + /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JNP_Jq }, + /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JL_Jq }, + /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JNL_Jq }, + /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JLE_Jq }, + /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JNLE_Jq }, /* 80 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfo64G1EbIb }, /* 81 */ { BxAnother | BxGroup1 | BxImmediate_Iv, NULL, BxOpcodeInfo64G1Ed }, /* 82 */ { 0, &BX_CPU_C::BxError }, @@ -1483,22 +1483,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 0F 7D */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7d }, /* 0F 7E */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7e }, /* 0F 7F */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7f }, - /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JO_Jq }, + /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JNO_Jq }, + /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JB_Jq }, + /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JNB_Jq }, /* 0F 84 */ { BxImmediate_BrOff32, &BX_CPU_C::JZ_Jq }, /* 0F 85 */ { BxImmediate_BrOff32, &BX_CPU_C::JNZ_Jq }, - /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JBE_Jq }, + /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JNBE_Jq }, + /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JS_Jq }, + /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JNS_Jq }, + /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JP_Jq }, + /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JNP_Jq }, + /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JL_Jq }, + /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JNL_Jq }, + /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JLE_Jq }, + /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JNLE_Jq }, /* 0F 90 */ { BxAnother, &BX_CPU_C::SETO_Eb }, /* 0F 91 */ { BxAnother, &BX_CPU_C::SETNO_Eb }, /* 0F 92 */ { BxAnother, &BX_CPU_C::SETB_Eb }, @@ -1725,22 +1725,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 6D */ { 0, &BX_CPU_C::REP_INSD_YdDX }, /* 6E */ { 0, &BX_CPU_C::REP_OUTSB_DXXb }, /* 6F */ { 0, &BX_CPU_C::REP_OUTSD_DXXd }, - /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 70 */ { BxImmediate_BrOff8, &BX_CPU_C::JO_Jq }, + /* 71 */ { BxImmediate_BrOff8, &BX_CPU_C::JNO_Jq }, + /* 72 */ { BxImmediate_BrOff8, &BX_CPU_C::JB_Jq }, + /* 73 */ { BxImmediate_BrOff8, &BX_CPU_C::JNB_Jq }, /* 74 */ { BxImmediate_BrOff8, &BX_CPU_C::JZ_Jq }, /* 75 */ { BxImmediate_BrOff8, &BX_CPU_C::JNZ_Jq }, - /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, - /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JCC_Jq }, + /* 76 */ { BxImmediate_BrOff8, &BX_CPU_C::JBE_Jq }, + /* 77 */ { BxImmediate_BrOff8, &BX_CPU_C::JNBE_Jq }, + /* 78 */ { BxImmediate_BrOff8, &BX_CPU_C::JS_Jq }, + /* 79 */ { BxImmediate_BrOff8, &BX_CPU_C::JNS_Jq }, + /* 7A */ { BxImmediate_BrOff8, &BX_CPU_C::JP_Jq }, + /* 7B */ { BxImmediate_BrOff8, &BX_CPU_C::JNP_Jq }, + /* 7C */ { BxImmediate_BrOff8, &BX_CPU_C::JL_Jq }, + /* 7D */ { BxImmediate_BrOff8, &BX_CPU_C::JNL_Jq }, + /* 7E */ { BxImmediate_BrOff8, &BX_CPU_C::JLE_Jq }, + /* 7F */ { BxImmediate_BrOff8, &BX_CPU_C::JNLE_Jq }, /* 80 */ { BxAnother | BxGroup1 | BxImmediate_Ib, NULL, BxOpcodeInfo64G1EbIb }, /* 81 */ { BxAnother | BxGroup1 | BxImmediate_Iv, NULL, BxOpcodeInfo64G1Eq }, /* 82 */ { 0, &BX_CPU_C::BxError }, @@ -2012,22 +2012,22 @@ static const BxOpcodeInfo_t BxOpcodeInfo64[512*3] = { /* 0F 7D */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7d }, /* 0F 7E */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7e }, /* 0F 7F */ { BxAnother | BxPrefixSSE, NULL, BxOpcodeGroupSSE_0f7f }, - /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 80 */ { BxImmediate_BrOff32, &BX_CPU_C::JO_Jq }, + /* 0F 81 */ { BxImmediate_BrOff32, &BX_CPU_C::JNO_Jq }, + /* 0F 82 */ { BxImmediate_BrOff32, &BX_CPU_C::JB_Jq }, + /* 0F 83 */ { BxImmediate_BrOff32, &BX_CPU_C::JNB_Jq }, /* 0F 84 */ { BxImmediate_BrOff32, &BX_CPU_C::JZ_Jq }, /* 0F 85 */ { BxImmediate_BrOff32, &BX_CPU_C::JNZ_Jq }, - /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, - /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JCC_Jq }, + /* 0F 86 */ { BxImmediate_BrOff32, &BX_CPU_C::JBE_Jq }, + /* 0F 87 */ { BxImmediate_BrOff32, &BX_CPU_C::JNBE_Jq }, + /* 0F 88 */ { BxImmediate_BrOff32, &BX_CPU_C::JS_Jq }, + /* 0F 89 */ { BxImmediate_BrOff32, &BX_CPU_C::JNS_Jq }, + /* 0F 8A */ { BxImmediate_BrOff32, &BX_CPU_C::JP_Jq }, + /* 0F 8B */ { BxImmediate_BrOff32, &BX_CPU_C::JNP_Jq }, + /* 0F 8C */ { BxImmediate_BrOff32, &BX_CPU_C::JL_Jq }, + /* 0F 8D */ { BxImmediate_BrOff32, &BX_CPU_C::JNL_Jq }, + /* 0F 8E */ { BxImmediate_BrOff32, &BX_CPU_C::JLE_Jq }, + /* 0F 8F */ { BxImmediate_BrOff32, &BX_CPU_C::JNLE_Jq }, /* 0F 90 */ { BxAnother, &BX_CPU_C::SETO_Eb }, /* 0F 91 */ { BxAnother, &BX_CPU_C::SETNO_Eb }, /* 0F 92 */ { BxAnother, &BX_CPU_C::SETB_Eb }, @@ -2162,7 +2162,8 @@ BX_CPU_C::fetchDecode64(Bit8u *iptr, bxInstruction_c *instruction, unsigned rema unsigned rex_prefix = 0; offset = 512*1; - instruction->ResolveModrm = NULL; + + instruction->ResolveModrm = ResolveDummy; instruction->initMetaInfo(/*os32*/ 1, // operand size 32 override defaults to 1 /*as32*/ 1, // address size 32 override defaults to 1 /*os64*/ 0, // operand size 64 override defaults to 0 diff --git a/bochs/cpu/resolve16.cc b/bochs/cpu/resolve16.cc index e441c6d3c..4b2abc45a 100644 --- a/bochs/cpu/resolve16.cc +++ b/bochs/cpu/resolve16.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: resolve16.cc,v 1.10 2006-03-06 22:03:01 sshwarts Exp $ +// $Id: resolve16.cc,v 1.11 2007-11-12 18:20:15 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -30,6 +30,12 @@ #include "cpu.h" #define LOG_THIS BX_CPU_THIS_PTR + void BX_CPP_AttrRegparmN(1) +BX_CPU_C::ResolveDummy(bxInstruction_c *i) +{ + return; // used when no memory access is needed +} + void BX_CPP_AttrRegparmN(1) BX_CPU_C::Resolve16Mod0Rm0(bxInstruction_c *i) {