Pre-calculate pow table for FXTRACT instruction
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
# include <pwd.h>
|
# include <pwd.h>
|
||||||
@@ -233,6 +234,8 @@ extern int CPUID;
|
|||||||
extern int output;
|
extern int output;
|
||||||
int atfullspeed;
|
int atfullspeed;
|
||||||
|
|
||||||
|
extern double exp_pow_table[0x800];
|
||||||
|
|
||||||
char exe_path[2048]; /* path (dir) of executable */
|
char exe_path[2048]; /* path (dir) of executable */
|
||||||
char usr_path[1024]; /* path (dir) of user data */
|
char usr_path[1024]; /* path (dir) of user data */
|
||||||
char cfg_path[1024]; /* full path of config file */
|
char cfg_path[1024]; /* full path of config file */
|
||||||
@@ -1086,6 +1089,11 @@ pc_init_modules(void)
|
|||||||
|
|
||||||
machine_status_init();
|
machine_status_init();
|
||||||
|
|
||||||
|
for (c = 0; c <= 0x7ff; c++) {
|
||||||
|
int64_t exp = c - 1023; /* 1023 = BIAS64 */
|
||||||
|
exp_pow_table[c] = pow(2.0, (double) exp);
|
||||||
|
}
|
||||||
|
|
||||||
if (do_nothing) {
|
if (do_nothing) {
|
||||||
do_nothing = 0;
|
do_nothing = 0;
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|||||||
@@ -287,6 +287,9 @@ uint8_t reg_30 = 0x00;
|
|||||||
uint8_t arr[24] = { 0 };
|
uint8_t arr[24] = { 0 };
|
||||||
uint8_t rcr[8] = { 0 };
|
uint8_t rcr[8] = { 0 };
|
||||||
|
|
||||||
|
/* Table for FXTRACT. */
|
||||||
|
double exp_pow_table[0x800];
|
||||||
|
|
||||||
static int cyrix_addr;
|
static int cyrix_addr;
|
||||||
|
|
||||||
static void cpu_write(uint16_t addr, uint8_t val, void *priv);
|
static void cpu_write(uint16_t addr, uint8_t val, void *priv);
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ extern void fpu_log(const char *fmt, ...);
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern double exp_pow_table[0x800];
|
||||||
|
|
||||||
static int rounding_modes[4] = { FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO };
|
static int rounding_modes[4] = { FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO };
|
||||||
|
|
||||||
#define ST(x) cpu_state.ST[((cpu_state.TOP + (x)) & 7)]
|
#define ST(x) cpu_state.ST[((cpu_state.TOP + (x)) & 7)]
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ opFXTRACT(UNUSED(uint32_t fetchdat))
|
|||||||
test.eind.d = ST(0);
|
test.eind.d = ST(0);
|
||||||
exp80 = test.eind.ll & 0x7ff0000000000000LL;
|
exp80 = test.eind.ll & 0x7ff0000000000000LL;
|
||||||
exp80final = (exp80 >> 52) - BIAS64;
|
exp80final = (exp80 >> 52) - BIAS64;
|
||||||
mant = test.eind.d / (pow(2.0, (double) exp80final));
|
mant = test.eind.d / exp_pow_table[exp80 >> 52];
|
||||||
ST(0) = (double) exp80final;
|
ST(0) = (double) exp80final;
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
x87_push(mant);
|
x87_push(mant);
|
||||||
|
|||||||
Reference in New Issue
Block a user