Remove code duplication from FXRSTOR functioN

This commit is contained in:
Stanislav Shwartsman 2003-10-25 10:32:54 +00:00
parent 4e74efdf0c
commit 2f20c087c3
4 changed files with 17 additions and 20 deletions

View File

@ -71,6 +71,8 @@ struct bx_fpu_reg_t {
} GCC_ATTRIBUTE((aligned(16), packed));
#endif
typedef struct bx_fpu_reg_t FPU_REG;
#define BX_FPU_REG(index) \
(BX_CPU_THIS_PTR the_i387.st_space[index*2])
@ -80,6 +82,14 @@ struct bx_fpu_reg_t {
#define FPU_SW_SUMMARY (0x0080) /* exception summary */
#ifdef __cplusplus
extern "C"
{
#endif
int FPU_tagof(FPU_REG *reg) BX_CPP_AttrRegparmN(1);
#ifdef __cplusplus
}
#endif
#if BX_SUPPORT_MMX

View File

@ -265,14 +265,7 @@ void BX_CPU_C::FXRSTOR(bxInstruction_c *i)
{
if(tag_byte & tag_byte_mask) {
bx_fpu_reg_t *fpu_reg = (bx_fpu_reg_t *) &(BX_FPU_REG(index));
if (fpu_reg->exp == 0) {
if(!(fpu_reg->sigl | fpu_reg->sigh)) twd |= FPU_TAG_ZERO;
else twd |= FPU_TAG_SPECIAL;
}
else if (fpu_reg->exp == 0x7fff) twd |= FPU_TAG_SPECIAL;
else if (fpu_reg->sigh & 0x80000000) twd |= FPU_TAG_VALID;
else twd |= FPU_TAG_SPECIAL;
twd = FPU_tagof(fpu_reg);
}
else {
twd |= FPU_TAG_EMPTY;

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------+
| fpu_emu.h |
| $Id: fpu_emu.h,v 1.19 2003-10-05 12:26:11 sshwarts Exp $
| $Id: fpu_emu.h,v 1.20 2003-10-25 10:32:54 sshwarts Exp $
| |
| Copyright (C) 1992,1993,1994,1997 |
| W. Metzenthen, 22 Parker St, Ormond, Vic 3163, |
@ -64,8 +64,6 @@
#include "fpu_system.h"
typedef struct bx_fpu_reg_t FPU_REG;
/*
#define RE_ENTRANT_CHECKING
*/

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------+
| reg_ld_str.c |
| $Id: reg_ld_str.c,v 1.17 2003-10-04 16:47:57 sshwarts Exp $
| $Id: reg_ld_str.c,v 1.18 2003-10-25 10:32:54 sshwarts Exp $
| |
| All of the functions which transfer data between user memory and FPU_REGs.|
| |
@ -60,15 +60,12 @@ normalize_no_excep(FPU_REG *r, int exp, int sign)
}
int BX_CPP_AttrRegparmN(1)
FPU_tagof(FPU_REG *ptr)
int BX_CPP_AttrRegparmN(1) FPU_tagof(FPU_REG *reg)
{
int exp;
exp = exponent16(ptr) & 0x7fff;
int exp = exponent16(reg) & 0x7fff;
if (exp == 0)
{
if (!(ptr->sigh | ptr->sigl))
if (!(reg->sigh | reg->sigl))
{
return TAG_Zero;
}
@ -82,7 +79,7 @@ FPU_tagof(FPU_REG *ptr)
return TAG_Special;
}
if (!(ptr->sigh & 0x80000000))
if (!(reg->sigh & 0x80000000))
{
/* Unsupported data type. */
/* Valid numbers have the ms bit set to 1. */
@ -93,7 +90,6 @@ FPU_tagof(FPU_REG *ptr)
return TAG_Valid;
}
/* Get a long double from user memory */
int BX_CPP_AttrRegparmN(2)
FPU_load_extended(bx_address s, int stnr)