Lazy falgs optimizations by Darek Mihocka
This commit is contained in:
parent
b2baef2c34
commit
f642b57a54
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: cpu.h,v 1.469 2008-05-02 22:47:07 sshwarts Exp $
|
||||
// $Id: cpu.h,v 1.470 2008-05-04 15:07:08 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -3374,9 +3374,9 @@ BX_CPP_INLINE bx_bool BX_CPU_C::get_PFLazy(void)
|
||||
|
||||
/* op1, op2, result */
|
||||
#define SET_FLAGS_OSZAPC_SIZE(size, lf_op1, lf_op2, lf_result, ins) { \
|
||||
BX_CPU_THIS_PTR oszapc.op1_##size = (lf_op1); \
|
||||
BX_CPU_THIS_PTR oszapc.op2_##size = (lf_op2); \
|
||||
BX_CPU_THIS_PTR oszapc.result = (Bit##size##s)(lf_result); \
|
||||
BX_CPU_THIS_PTR oszapc.op1 = (bx_address)(Bit##size##s)(lf_op1); \
|
||||
BX_CPU_THIS_PTR oszapc.op2 = (bx_address)(Bit##size##s)(lf_op2); \
|
||||
BX_CPU_THIS_PTR oszapc.result = (bx_address)(Bit##size##s)(lf_result); \
|
||||
BX_CPU_THIS_PTR oszapc.instr = (ins); \
|
||||
BX_CPU_THIS_PTR lf_flags_status = EFlagsOSZAPCMask; \
|
||||
}
|
||||
@ -3394,7 +3394,7 @@ BX_CPP_INLINE bx_bool BX_CPU_C::get_PFLazy(void)
|
||||
|
||||
/* op1 and result only */
|
||||
#define SET_FLAGS_OSZAPC_S1_SIZE(size, lf_op1, lf_result, ins) { \
|
||||
BX_CPU_THIS_PTR oszapc.op1_##size = (lf_op1); \
|
||||
BX_CPU_THIS_PTR oszapc.op1 = (bx_address)(Bit##size##s)(lf_op1); \
|
||||
BX_CPU_THIS_PTR oszapc.result = (Bit##size##s)(lf_result); \
|
||||
BX_CPU_THIS_PTR oszapc.instr = (ins); \
|
||||
BX_CPU_THIS_PTR lf_flags_status = EFlagsOSZAPCMask; \
|
||||
@ -3413,7 +3413,7 @@ BX_CPP_INLINE bx_bool BX_CPU_C::get_PFLazy(void)
|
||||
|
||||
/* op2 and result only */
|
||||
#define SET_FLAGS_OSZAPC_S2_SIZE(size, lf_op2, lf_result, ins) { \
|
||||
BX_CPU_THIS_PTR oszapc.op2_##size = (lf_op2); \
|
||||
BX_CPU_THIS_PTR oszapc.op2 = (bx_address)(Bit##size##s)(lf_op2); \
|
||||
BX_CPU_THIS_PTR oszapc.result = (Bit##size##s)(lf_result); \
|
||||
BX_CPU_THIS_PTR oszapc.instr = (ins); \
|
||||
BX_CPU_THIS_PTR lf_flags_status = EFlagsOSZAPCMask; \
|
||||
|
@ -1,14 +1,9 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: icache.h,v 1.34 2008-05-04 05:37:36 sshwarts Exp $
|
||||
// $Id: icache.h,v 1.35 2008-05-04 15:07:08 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
//
|
||||
// MandrakeSoft S.A.
|
||||
// 43, rue d'Aboukir
|
||||
// 75002 Paris - France
|
||||
// http://www.linux-mandrake.com/
|
||||
// http://www.mandrakesoft.com/
|
||||
// Copyright (c) 2007 Stanislav Shwartsman
|
||||
// Written by Stanislav Shwartsman [sshwarts at sourceforge net]
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: lazy_flags.cc,v 1.46 2008-04-04 22:39:45 sshwarts Exp $
|
||||
// $Id: lazy_flags.cc,v 1.47 2008-05-04 15:07:08 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -52,10 +52,23 @@ const bx_bool bx_parity_lookup[256] = {
|
||||
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1
|
||||
};
|
||||
|
||||
#define result_8 ((Bit8u) (BX_CPU_THIS_PTR oszapc.result))
|
||||
#define op1_8 ((Bit8u)(BX_CPU_THIS_PTR oszapc.op1))
|
||||
#define op2_8 ((Bit8u)(BX_CPU_THIS_PTR oszapc.op2))
|
||||
#define result_8 ((Bit8u)(BX_CPU_THIS_PTR oszapc.result))
|
||||
|
||||
#define op1_16 ((Bit16u)(BX_CPU_THIS_PTR oszapc.op1))
|
||||
#define op2_16 ((Bit16u)(BX_CPU_THIS_PTR oszapc.op2))
|
||||
#define result_16 ((Bit16u)(BX_CPU_THIS_PTR oszapc.result))
|
||||
|
||||
#define op1_32 ((Bit32u)(BX_CPU_THIS_PTR oszapc.op1))
|
||||
#define op2_32 ((Bit32u)(BX_CPU_THIS_PTR oszapc.op2))
|
||||
#define result_32 ((Bit32u)(BX_CPU_THIS_PTR oszapc.result))
|
||||
#define result_64 (BX_CPU_THIS_PTR oszapc.result)
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
#define op1_64 ((Bit64u)(BX_CPU_THIS_PTR oszapc.op1))
|
||||
#define op2_64 ((Bit64u)(BX_CPU_THIS_PTR oszapc.op2))
|
||||
#define result_64 ((Bit64u)(BX_CPU_THIS_PTR oszapc.result))
|
||||
#endif
|
||||
|
||||
bx_bool BX_CPU_C::get_CFLazy(void)
|
||||
{
|
||||
@ -63,83 +76,57 @@ bx_bool BX_CPU_C::get_CFLazy(void)
|
||||
|
||||
switch (BX_CPU_THIS_PTR oszapc.instr) {
|
||||
case BX_LF_INSTR_ADD8:
|
||||
cf = (result_8 < BX_CPU_THIS_PTR oszapc.op1_8);
|
||||
break;
|
||||
case BX_LF_INSTR_ADD16:
|
||||
cf = (result_16 < BX_CPU_THIS_PTR oszapc.op1_16);
|
||||
break;
|
||||
case BX_LF_INSTR_ADD32:
|
||||
cf = (result_32 < BX_CPU_THIS_PTR oszapc.op1_32);
|
||||
cf = (result_32 < op1_32);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
case BX_LF_INSTR_ADD64:
|
||||
cf = (result_64 < BX_CPU_THIS_PTR oszapc.op1_64);
|
||||
cf = (result_64 < op1_64);
|
||||
break;
|
||||
#endif
|
||||
// used only if CF = 1 when executing ADC instruction
|
||||
case BX_LF_INSTR_ADC8:
|
||||
cf = (result_8 <= BX_CPU_THIS_PTR oszapc.op1_8);
|
||||
break;
|
||||
// used only if CF = 1 when executing ADC instruction
|
||||
case BX_LF_INSTR_ADC16:
|
||||
cf = (result_16 <= BX_CPU_THIS_PTR oszapc.op1_16);
|
||||
break;
|
||||
// used only if CF = 1 when executing ADC instruction
|
||||
case BX_LF_INSTR_ADC32:
|
||||
cf = (result_32 <= BX_CPU_THIS_PTR oszapc.op1_32);
|
||||
cf = (result_32 <= op1_32);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
// used only if CF = 1 when executing ADC instruction
|
||||
case BX_LF_INSTR_ADC64:
|
||||
cf = (result_64 <= BX_CPU_THIS_PTR oszapc.op1_64);
|
||||
cf = (result_64 <= op1_64);
|
||||
break;
|
||||
#endif
|
||||
case BX_LF_INSTR_SUB8:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_8 <
|
||||
BX_CPU_THIS_PTR oszapc.op2_8);
|
||||
break;
|
||||
case BX_LF_INSTR_SUB16:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_16 <
|
||||
BX_CPU_THIS_PTR oszapc.op2_16);
|
||||
break;
|
||||
case BX_LF_INSTR_SUB32:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_32 <
|
||||
BX_CPU_THIS_PTR oszapc.op2_32);
|
||||
cf = (op1_32 < op2_32);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
case BX_LF_INSTR_SUB64:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_64 <
|
||||
BX_CPU_THIS_PTR oszapc.op2_64);
|
||||
cf = (op1_64 < op2_64);
|
||||
break;
|
||||
#endif
|
||||
// used only if CF = 1 when executing SBB instruction
|
||||
case BX_LF_INSTR_SBB8:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_8 < result_8) ||
|
||||
(BX_CPU_THIS_PTR oszapc.op2_8==0xff);
|
||||
cf = (op1_8 < result_8) || (op2_8==0xff);
|
||||
break;
|
||||
// used only if CF = 1 when executing SBB instruction
|
||||
case BX_LF_INSTR_SBB16:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_16 < result_16) ||
|
||||
(BX_CPU_THIS_PTR oszapc.op2_16==0xffff);
|
||||
cf = (op1_16 < result_16) || (op2_16==0xffff);
|
||||
break;
|
||||
// used only if CF = 1 when executing SBB instruction
|
||||
case BX_LF_INSTR_SBB32:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_32 < result_32) ||
|
||||
(BX_CPU_THIS_PTR oszapc.op2_32==0xffffffff);
|
||||
cf = (op1_32 < result_32) || (op2_32==0xffffffff);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
// used only if CF = 1 when executing SBB instruction
|
||||
case BX_LF_INSTR_SBB64:
|
||||
cf = (BX_CPU_THIS_PTR oszapc.op1_64 < result_64) ||
|
||||
(BX_CPU_THIS_PTR oszapc.op2_64==BX_CONST64(0xffffffffffffffff));
|
||||
cf = (op1_64 < result_64) || (op2_64==BX_CONST64(0xffffffffffffffff));
|
||||
break;
|
||||
#endif
|
||||
case BX_LF_INSTR_NEG8:
|
||||
cf = (result_8 != 0);
|
||||
break;
|
||||
case BX_LF_INSTR_NEG16:
|
||||
cf = (result_16 != 0);
|
||||
break;
|
||||
case BX_LF_INSTR_NEG32:
|
||||
cf = (result_32 != 0);
|
||||
break;
|
||||
@ -174,32 +161,22 @@ bx_bool BX_CPU_C::get_AFLazy(void)
|
||||
case BX_LF_INSTR_ADC8:
|
||||
case BX_LF_INSTR_SUB8:
|
||||
case BX_LF_INSTR_SBB8:
|
||||
af = ((BX_CPU_THIS_PTR oszapc.op1_8 ^
|
||||
BX_CPU_THIS_PTR oszapc.op2_8) ^ result_8) & 0x10;
|
||||
break;
|
||||
case BX_LF_INSTR_ADD16:
|
||||
case BX_LF_INSTR_ADC16:
|
||||
case BX_LF_INSTR_SUB16:
|
||||
case BX_LF_INSTR_SBB16:
|
||||
af = ((BX_CPU_THIS_PTR oszapc.op1_16 ^
|
||||
BX_CPU_THIS_PTR oszapc.op2_16) ^ result_16) & 0x10;
|
||||
break;
|
||||
case BX_LF_INSTR_ADD32:
|
||||
case BX_LF_INSTR_ADC32:
|
||||
case BX_LF_INSTR_SUB32:
|
||||
case BX_LF_INSTR_SBB32:
|
||||
af = ((BX_CPU_THIS_PTR oszapc.op1_32 ^
|
||||
BX_CPU_THIS_PTR oszapc.op2_32) ^ result_32) & 0x10;
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
case BX_LF_INSTR_ADD64:
|
||||
case BX_LF_INSTR_ADC64:
|
||||
case BX_LF_INSTR_SUB64:
|
||||
case BX_LF_INSTR_SBB64:
|
||||
af = ((BX_CPU_THIS_PTR oszapc.op1_64 ^
|
||||
BX_CPU_THIS_PTR oszapc.op2_64) ^ result_64) & 0x10;
|
||||
break;
|
||||
#endif
|
||||
af = ((op1_8 ^ op2_8) ^ result_8) & 0x10;
|
||||
break;
|
||||
case BX_LF_INSTR_NEG8:
|
||||
case BX_LF_INSTR_NEG16:
|
||||
case BX_LF_INSTR_NEG32:
|
||||
@ -253,54 +230,30 @@ bx_bool BX_CPU_C::get_OFLazy(void)
|
||||
switch (BX_CPU_THIS_PTR oszapc.instr) {
|
||||
case BX_LF_INSTR_ADD8:
|
||||
case BX_LF_INSTR_ADC8:
|
||||
of = GET_ADD_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_8,
|
||||
BX_CPU_THIS_PTR oszapc.op2_8,
|
||||
result_8, 0x80);
|
||||
break;
|
||||
case BX_LF_INSTR_ADD16:
|
||||
case BX_LF_INSTR_ADC16:
|
||||
of = GET_ADD_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_16,
|
||||
BX_CPU_THIS_PTR oszapc.op2_16,
|
||||
result_16, 0x8000);
|
||||
break;
|
||||
case BX_LF_INSTR_ADD32:
|
||||
case BX_LF_INSTR_ADC32:
|
||||
of = GET_ADD_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_32,
|
||||
BX_CPU_THIS_PTR oszapc.op2_32,
|
||||
result_32, 0x80000000);
|
||||
of = GET_ADD_OVERFLOW(op1_32, op2_32, result_32, 0x80000000);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
case BX_LF_INSTR_ADD64:
|
||||
case BX_LF_INSTR_ADC64:
|
||||
of = GET_ADD_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_64,
|
||||
BX_CPU_THIS_PTR oszapc.op2_64,
|
||||
result_64, BX_CONST64(0x8000000000000000));
|
||||
of = GET_ADD_OVERFLOW(op1_64, op2_64, result_64, BX_CONST64(0x8000000000000000));
|
||||
break;
|
||||
#endif
|
||||
case BX_LF_INSTR_SUB8:
|
||||
case BX_LF_INSTR_SBB8:
|
||||
of = GET_SUB_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_8,
|
||||
BX_CPU_THIS_PTR oszapc.op2_8,
|
||||
result_8, 0x80);
|
||||
break;
|
||||
case BX_LF_INSTR_SUB16:
|
||||
case BX_LF_INSTR_SBB16:
|
||||
of = GET_SUB_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_16,
|
||||
BX_CPU_THIS_PTR oszapc.op2_16,
|
||||
result_16, 0x8000);
|
||||
break;
|
||||
case BX_LF_INSTR_SUB32:
|
||||
case BX_LF_INSTR_SBB32:
|
||||
of = GET_SUB_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_32,
|
||||
BX_CPU_THIS_PTR oszapc.op2_32,
|
||||
result_32, 0x80000000);
|
||||
of = GET_SUB_OVERFLOW(op1_32, op2_32, result_32, 0x80000000);
|
||||
break;
|
||||
#if BX_SUPPORT_X86_64
|
||||
case BX_LF_INSTR_SUB64:
|
||||
case BX_LF_INSTR_SBB64:
|
||||
of = GET_SUB_OVERFLOW(BX_CPU_THIS_PTR oszapc.op1_64,
|
||||
BX_CPU_THIS_PTR oszapc.op2_64,
|
||||
result_64, BX_CONST64(0x8000000000000000));
|
||||
of = GET_SUB_OVERFLOW(op1_64, op2_64, result_64, BX_CONST64(0x8000000000000000));
|
||||
break;
|
||||
#endif
|
||||
case BX_LF_INSTR_LOGIC8:
|
||||
@ -313,12 +266,8 @@ bx_bool BX_CPU_C::get_OFLazy(void)
|
||||
break;
|
||||
case BX_LF_INSTR_NEG8:
|
||||
case BX_LF_INSTR_INC8:
|
||||
of = (result_8 == 0x80);
|
||||
break;
|
||||
case BX_LF_INSTR_NEG16:
|
||||
case BX_LF_INSTR_INC16:
|
||||
of = (result_16 == 0x8000);
|
||||
break;
|
||||
case BX_LF_INSTR_NEG32:
|
||||
case BX_LF_INSTR_INC32:
|
||||
of = (result_32 == 0x80000000);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: lazy_flags.h,v 1.32 2008-04-04 22:39:45 sshwarts Exp $
|
||||
// $Id: lazy_flags.h,v 1.33 2008-05-04 15:07:08 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -88,22 +88,9 @@
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
Bit8u op1_8;
|
||||
Bit8u op2_8;
|
||||
|
||||
Bit16u op1_16;
|
||||
Bit16u op2_16;
|
||||
|
||||
Bit32u op1_32;
|
||||
Bit32u op2_32;
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
Bit64u op1_64;
|
||||
Bit64u op2_64;
|
||||
#endif
|
||||
|
||||
bx_address op1;
|
||||
bx_address op2;
|
||||
bx_address result;
|
||||
|
||||
unsigned instr;
|
||||
} bx_lf_flags_entry;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user