x87 fix
This commit is contained in:
parent
bc9a191e2d
commit
89f057ae7b
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: cpu.h,v 1.593 2009-04-14 13:43:21 sshwarts Exp $
|
||||
// $Id: cpu.h,v 1.594 2009-04-27 14:00:54 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -3268,8 +3268,9 @@ public: // for now...
|
||||
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_SMF void print_state_FPU(void);
|
||||
BX_SMF void prepareFPU(bxInstruction_c *i, bx_bool = 1, bx_bool = 1);
|
||||
BX_SMF void prepareFPU(bxInstruction_c *i, bx_bool = 1);
|
||||
BX_SMF void FPU_check_pending_exceptions(void);
|
||||
BX_SMF void FPU_update_last_instruction(bxInstruction_c *i);
|
||||
BX_SMF void FPU_stack_underflow(int stnr, int pop_stack = 0);
|
||||
BX_SMF void FPU_stack_overflow(void);
|
||||
BX_SMF unsigned FPU_exception(unsigned exception, bx_bool is_mem = 0);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu.cc,v 1.54 2009-04-12 19:13:13 sshwarts Exp $
|
||||
// $Id: fpu.cc,v 1.55 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -29,31 +29,27 @@
|
||||
|
||||
#include "iodev/iodev.h"
|
||||
|
||||
#define UPDATE_LAST_OPCODE 1
|
||||
#define CHECK_PENDING_EXCEPTIONS 1
|
||||
|
||||
#if BX_SUPPORT_FPU
|
||||
void BX_CPU_C::prepareFPU(bxInstruction_c *i,
|
||||
bx_bool check_pending_exceptions, bx_bool update_last_instruction)
|
||||
void BX_CPU_C::prepareFPU(bxInstruction_c *i, bx_bool check_pending_exceptions)
|
||||
{
|
||||
if (BX_CPU_THIS_PTR cr0.get_EM() || BX_CPU_THIS_PTR cr0.get_TS())
|
||||
exception(BX_NM_EXCEPTION, 0, 0);
|
||||
|
||||
if (check_pending_exceptions)
|
||||
BX_CPU_THIS_PTR FPU_check_pending_exceptions();
|
||||
}
|
||||
|
||||
if (update_last_instruction)
|
||||
{
|
||||
BX_CPU_THIS_PTR the_i387.foo = (((Bit32u)(i->b1()) << 8) | i->modrm()) & 0x7ff;
|
||||
BX_CPU_THIS_PTR the_i387.fcs = BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||
BX_CPU_THIS_PTR the_i387.fip = BX_CPU_THIS_PTR prev_rip;
|
||||
void BX_CPU_C::FPU_update_last_instruction(bxInstruction_c *i)
|
||||
{
|
||||
BX_CPU_THIS_PTR the_i387.foo = (((Bit32u)(i->b1()) << 8) | i->modrm()) & 0x7ff;
|
||||
BX_CPU_THIS_PTR the_i387.fcs = BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||
BX_CPU_THIS_PTR the_i387.fip = BX_CPU_THIS_PTR prev_rip;
|
||||
|
||||
if (! i->modC0()) {
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR the_i387.fds = BX_CPU_THIS_PTR sregs[i->seg()].selector.value;
|
||||
BX_CPU_THIS_PTR the_i387.fdp = RMAddr(i);
|
||||
}
|
||||
if (! i->modC0()) {
|
||||
BX_CPU_THIS_PTR the_i387.fds = BX_CPU_THIS_PTR sregs[i->seg()].selector.value;
|
||||
BX_CPU_THIS_PTR the_i387.fdp = RMAddr(i);
|
||||
}
|
||||
}
|
||||
|
||||
@ -329,7 +325,7 @@ bx_address BX_CPU_C::fpu_load_environment(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDCW(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
@ -356,7 +352,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDCW(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTCW(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
Bit16u cwd = BX_CPU_THIS_PTR the_i387.get_control_word();
|
||||
|
||||
@ -372,7 +368,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTCW(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTSW(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
Bit16u swd = BX_CPU_THIS_PTR the_i387.get_status_word();
|
||||
|
||||
@ -388,7 +384,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTSW(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTSW_AX(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
AX = BX_CPU_THIS_PTR the_i387.get_status_word();
|
||||
#else
|
||||
BX_INFO(("FNSTSW_AX: required FPU, configure --enable-fpu"));
|
||||
@ -399,7 +395,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTSW_AX(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FRSTOR(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
bx_address offset = fpu_load_environment(i);
|
||||
floatx80 tmp;
|
||||
@ -423,7 +419,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FRSTOR(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSAVE(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
bx_address offset = fpu_save_environment(i);
|
||||
|
||||
@ -445,7 +441,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSAVE(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNCLEX(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
FPU_PARTIAL_STATUS &= ~(FPU_SW_Backward|FPU_SW_Summary|FPU_SW_Stack_Fault|FPU_SW_Precision|
|
||||
FPU_SW_Underflow|FPU_SW_Overflow|FPU_SW_Zero_Div|FPU_SW_Denormal_Op|
|
||||
@ -461,7 +457,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNCLEX(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNINIT(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
BX_CPU_THIS_PTR the_i387.init();
|
||||
#else
|
||||
BX_INFO(("FNINIT: required FPU, configure --enable-fpu"));
|
||||
@ -472,7 +468,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNINIT(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDENV(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS);
|
||||
fpu_load_environment(i);
|
||||
|
||||
/* read all registers in stack order and update x87 tag word */
|
||||
@ -492,7 +488,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDENV(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTENV(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
fpu_save_environment(i);
|
||||
/* mask all floating point exceptions */
|
||||
FPU_CONTROL_WORD |= FPU_CW_Exceptions_Mask;
|
||||
@ -507,7 +503,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNSTENV(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNOP(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
// Perform no FPU operation. This instruction takes up space in the
|
||||
// instruction stream but does not affect the FPU or machine
|
||||
@ -520,7 +516,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FNOP(bxInstruction_c *i)
|
||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::FPLEGACY(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS, !UPDATE_LAST_OPCODE);
|
||||
BX_CPU_THIS_PTR prepareFPU(i, !CHECK_PENDING_EXCEPTIONS);
|
||||
|
||||
// FPU performs no specific operation and no internal x87 states
|
||||
// are affected
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_arith.cc,v 1.18 2009-04-23 05:16:29 sshwarts Exp $
|
||||
// $Id: fpu_arith.cc,v 1.19 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -156,6 +156,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FADD_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -184,6 +185,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FADD_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -218,8 +220,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FADD_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -246,8 +251,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FADD_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -274,8 +282,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIADD_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -303,8 +314,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIADD_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -331,6 +345,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FMUL_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -359,6 +374,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FMUL_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -393,8 +409,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FMUL_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -421,8 +440,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FMUL_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -449,8 +471,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIMUL_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -478,8 +503,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIMUL_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -506,6 +534,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUB_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -534,6 +563,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUBR_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -562,6 +592,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUB_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -595,6 +626,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUBR_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -629,8 +661,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUB_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -657,8 +692,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUBR_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -685,8 +723,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUB_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -713,8 +754,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSUBR_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -742,8 +786,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISUB_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -771,8 +818,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISUBR_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -800,8 +850,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISUB_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -830,8 +883,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISUBR_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -858,6 +914,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIV_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -886,6 +943,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIVR_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -914,6 +972,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIV_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -947,6 +1006,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIVR_STi_ST0(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 2;
|
||||
|
||||
@ -981,8 +1041,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIV_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1009,8 +1072,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIVR_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1037,8 +1103,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIV_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1065,8 +1134,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDIVR_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1093,8 +1165,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIDIV_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1122,8 +1197,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIDIVR_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1151,8 +1229,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIDIV_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1180,8 +1261,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIDIVR_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
@ -1208,6 +1292,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSQRT(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -1233,6 +1318,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FRNDINT(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_compare.cc,v 1.22 2009-04-12 22:07:59 sshwarts Exp $
|
||||
// $Id: fpu_compare.cc,v 1.23 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -81,6 +81,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOM_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
// handle special case of FSTP opcode @ 0xDE 0xD0..D7
|
||||
@ -121,6 +122,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOMI_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if (BX_CPU_LEVEL >= 6) || (BX_CPU_LEVEL_HACKED >= 6)
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 4;
|
||||
|
||||
@ -159,6 +161,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FUCOMI_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if (BX_CPU_LEVEL >= 6) || (BX_CPU_LEVEL_HACKED >= 6)
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->b1() & 4;
|
||||
|
||||
@ -197,6 +200,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FUCOM_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
|
||||
@ -235,8 +239,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOM_SINGLE_REAL(bxInstruction_c *i)
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0))
|
||||
@ -275,8 +282,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOM_DOUBLE_REAL(bxInstruction_c *i)
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0))
|
||||
@ -315,8 +325,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FICOM_WORD_INTEGER(bxInstruction_c *i)
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0))
|
||||
@ -355,8 +368,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FICOM_DWORD_INTEGER(bxInstruction_c *i)
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (IS_TAG_EMPTY(0))
|
||||
@ -392,6 +408,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOMPP(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -428,6 +445,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FUCOMPP(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
if (IS_TAG_EMPTY(0) || IS_TAG_EMPTY(1))
|
||||
{
|
||||
@ -461,6 +479,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCMOV_ST0_STj(bxInstruction_c *i)
|
||||
{
|
||||
#if (BX_CPU_LEVEL >= 6) || (BX_CPU_LEVEL_HACKED >= 6)
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
if (IS_TAG_EMPTY(0) || IS_TAG_EMPTY(i->rm()))
|
||||
{
|
||||
@ -497,6 +516,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FTST(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -524,6 +544,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FXAM(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
floatx80 reg = BX_READ_FPU_REG(0);
|
||||
int sign = floatx80_sign(reg);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_const.cc,v 1.16 2009-04-13 08:37:49 sshwarts Exp $
|
||||
// $Id: fpu_const.cc,v 1.17 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -56,6 +56,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDL2T(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -76,6 +77,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDL2E(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -96,6 +98,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDPI(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -116,6 +119,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDLG2(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -136,6 +140,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDLN2(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -156,6 +161,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLD1(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -176,6 +182,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLDZ(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_load_store.cc,v 1.32 2009-03-10 21:43:11 sshwarts Exp $
|
||||
// $Id: fpu_load_store.cc,v 1.33 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -36,6 +36,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLD_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -70,8 +71,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLD_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float32 load_reg = read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -99,8 +103,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLD_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
float64 load_reg = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -129,9 +136,13 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FLD_EXTENDED_REAL(bxInstruction_c *i)
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
floatx80 result;
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
result.fraction = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
result.exp = read_virtual_word (i->seg(), RMAddr(i)+8);
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -152,8 +163,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FILD_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16s load_reg = (Bit16s) read_virtual_word(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -175,8 +189,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FILD_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit32s load_reg = (Bit32s) read_virtual_dword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -198,8 +215,11 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FILD_QWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit64s load_reg = (Bit64s) read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1)) {
|
||||
@ -221,10 +241,12 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FBLD_PACKED_BCD(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
// read packed bcd from memory
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
Bit16u hi2 = read_virtual_word (i->seg(), RMAddr(i) + 8);
|
||||
Bit64u lo8 = read_virtual_qword(i->seg(), RMAddr(i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
if (! IS_TAG_EMPTY(-1))
|
||||
@ -262,6 +284,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FST_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
// handle special case of FSTP opcode @ 0xDF 0xD0..D7
|
||||
@ -290,6 +313,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FST_SINGLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
float32 save_reg = float32_default_nan; /* The masked response */
|
||||
@ -328,6 +355,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FST_DOUBLE_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
float64 save_reg = float64_default_nan; /* The masked response */
|
||||
@ -367,6 +398,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSTP_EXTENDED_REAL(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
floatx80 save_reg = floatx80_default_nan; /* The masked response */
|
||||
@ -397,6 +432,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIST_WORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit16s save_reg = int16_indefinite;
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
@ -435,6 +474,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FIST_DWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit32s save_reg = int32_indefinite; /* The masked response */
|
||||
|
||||
int pop_stack = i->nnn() & 1;
|
||||
@ -473,6 +516,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISTP_QWORD_INTEGER(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit64s save_reg = int64_indefinite; /* The masked response */
|
||||
|
||||
clear_C1();
|
||||
@ -507,6 +554,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FBSTP_PACKED_BCD(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
/*
|
||||
* The packed BCD integer indefinite encoding (FFFFC000000000000000H)
|
||||
* is stored in response to a masked floating-point invalid-operation
|
||||
@ -579,6 +630,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISTTP16(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_SSE >= 3
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit16s save_reg = int16_indefinite; /* The masked response */
|
||||
|
||||
clear_C1();
|
||||
@ -615,6 +670,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISTTP32(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_SSE >= 3
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit32s save_reg = int32_indefinite; /* The masked response */
|
||||
|
||||
clear_C1();
|
||||
@ -651,6 +710,10 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FISTTP64(bxInstruction_c *i)
|
||||
#if BX_SUPPORT_SSE >= 3
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
|
||||
RMAddr(i) = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
|
||||
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
Bit64s save_reg = int64_indefinite; /* The masked response */
|
||||
|
||||
clear_C1();
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_misc.cc,v 1.17 2009-03-10 21:43:11 sshwarts Exp $
|
||||
// $Id: fpu_misc.cc,v 1.18 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -35,6 +35,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FXCH_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
int st0_tag = BX_CPU_THIS_PTR the_i387.FPU_gettagi(0);
|
||||
int sti_tag = BX_CPU_THIS_PTR the_i387.FPU_gettagi(i->rm());
|
||||
@ -72,6 +73,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCHS(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
BX_CPU_THIS_PTR FPU_stack_underflow(0);
|
||||
@ -91,6 +93,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FABS(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
if (IS_TAG_EMPTY(0)) {
|
||||
BX_CPU_THIS_PTR FPU_stack_underflow(0);
|
||||
@ -110,6 +113,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FDECSTP(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -124,6 +128,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FINCSTP(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -138,6 +143,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FFREE_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
BX_CPU_THIS_PTR the_i387.FPU_settagi(FPU_Tag_Empty, i->rm());
|
||||
#else
|
||||
BX_INFO(("FFREE_STi: required FPU, configure --enable-fpu"));
|
||||
@ -154,6 +160,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FFREEP_STi(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
BX_CPU_THIS_PTR the_i387.FPU_settagi(FPU_Tag_Empty, i->rm());
|
||||
BX_CPU_THIS_PTR the_i387.FPU_pop();
|
||||
#else
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: fpu_trans.cc,v 1.21 2009-03-10 21:43:11 sshwarts Exp $
|
||||
// $Id: fpu_trans.cc,v 1.22 2009-04-27 14:00:55 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2003 Stanislav Shwartsman
|
||||
@ -38,6 +38,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::F2XM1(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -63,6 +64,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FYL2X(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -91,6 +93,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FPTAN(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
clear_C2();
|
||||
@ -152,6 +155,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FPATAN(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -180,6 +184,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FXTRACT(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -222,6 +227,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FPREM1(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -262,6 +268,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FPREM(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -303,6 +310,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FYL2XP1(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -331,6 +339,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSINCOS(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
clear_C2();
|
||||
@ -379,6 +388,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSCALE(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
|
||||
@ -405,6 +415,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FSIN(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
clear_C2();
|
||||
@ -436,6 +447,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::FCOS(bxInstruction_c *i)
|
||||
{
|
||||
#if BX_SUPPORT_FPU
|
||||
BX_CPU_THIS_PTR prepareFPU(i);
|
||||
BX_CPU_THIS_PTR FPU_update_last_instruction(i);
|
||||
|
||||
clear_C1();
|
||||
clear_C2();
|
||||
|
Loading…
Reference in New Issue
Block a user