Merge pull request #2022 from goshhhy/fpu_iu_concurrency
Correctly emulate FPU concurrent execution timings
This commit is contained in:
@@ -1046,8 +1046,8 @@ pc_reset_hard_init(void)
|
|||||||
atfullspeed = 0;
|
atfullspeed = 0;
|
||||||
pc_full_speed();
|
pc_full_speed();
|
||||||
|
|
||||||
|
|
||||||
cycles = 0;
|
cycles = 0;
|
||||||
|
fpu_cycles = 0;
|
||||||
#ifdef USE_DYNAREC
|
#ifdef USE_DYNAREC
|
||||||
cycles_main = 0;
|
cycles_main = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -81,7 +81,20 @@ x386_log(const char *fmt, ...)
|
|||||||
|
|
||||||
#define OP_TABLE(name) ops_ ## name
|
#define OP_TABLE(name) ops_ ## name
|
||||||
|
|
||||||
#define CLOCK_CYCLES(c) cycles -= (c)
|
#define CLOCK_CYCLES(c) \
|
||||||
|
{\
|
||||||
|
if (fpu_cycles > 0) {\
|
||||||
|
fpu_cycles -= (c);\
|
||||||
|
if (fpu_cycles < 0) {\
|
||||||
|
cycles += fpu_cycles;\
|
||||||
|
}\
|
||||||
|
} else {\
|
||||||
|
cycles -= (c);\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||||
|
#define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||||
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
#include "x86_ops.h"
|
#include "x86_ops.h"
|
||||||
|
@@ -267,9 +267,22 @@ static void prefetch_flush()
|
|||||||
|
|
||||||
|
|
||||||
#define OP_TABLE(name) ops_ ## name
|
#define OP_TABLE(name) ops_ ## name
|
||||||
#define CLOCK_CYCLES(c) cycles -= (c)
|
#define CLOCK_CYCLES(c) \
|
||||||
|
{\
|
||||||
|
if (fpu_cycles > 0) {\
|
||||||
|
fpu_cycles -= (c);\
|
||||||
|
if (fpu_cycles < 0) {\
|
||||||
|
cycles += fpu_cycles;\
|
||||||
|
}\
|
||||||
|
} else {\
|
||||||
|
cycles -= (c);\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
#define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||||
|
#define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||||
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
|
|
||||||
#include "386_ops.h"
|
#include "386_ops.h"
|
||||||
|
|
||||||
|
|
||||||
|
@@ -65,6 +65,8 @@ static __inline void fetch_ea_16_long(uint32_t rmdat)
|
|||||||
#define OP_TABLE(name) dynarec_ops_ ## name
|
#define OP_TABLE(name) dynarec_ops_ ## name
|
||||||
|
|
||||||
#define CLOCK_CYCLES(c)
|
#define CLOCK_CYCLES(c)
|
||||||
|
#define CLOCK_CYCLES_FPU(c)
|
||||||
|
#define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||||
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||||
|
|
||||||
#include "386_ops.h"
|
#include "386_ops.h"
|
||||||
|
@@ -89,11 +89,32 @@ static int refresh = 0, cycdiff;
|
|||||||
wait(val, 0); \
|
wait(val, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CLOCK_CYCLES(val) \
|
#define CLOCK_CYCLES_ALWAYS(val) \
|
||||||
{ \
|
{ \
|
||||||
wait(val, 0); \
|
wait(val, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CLOCK_CYCLES_FPU(val) \
|
||||||
|
{ \
|
||||||
|
wait(val, 0); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CLOCK_CYCLES(val) \
|
||||||
|
{ \
|
||||||
|
if (fpu_cycles > 0) { \
|
||||||
|
fpu_cycles -= (val); \
|
||||||
|
if (fpu_cycles < 0) { \
|
||||||
|
wait(val, 0); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
wait(val, 0); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||||
|
|
||||||
|
|
||||||
typedef int (*OpFn)(uint32_t fetchdat);
|
typedef int (*OpFn)(uint32_t fetchdat);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1369,6 +1369,7 @@ cpu_set(void)
|
|||||||
case FPU_487SX:
|
case FPU_487SX:
|
||||||
default:
|
default:
|
||||||
x87_timings = x87_timings_486;
|
x87_timings = x87_timings_486;
|
||||||
|
x87_concurrency = x87_concurrency_486;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is386) {
|
if (is386) {
|
||||||
|
@@ -354,7 +354,7 @@ typedef struct {
|
|||||||
uint8_t ssegs, ismmx,
|
uint8_t ssegs, ismmx,
|
||||||
abrt, _smi_line;
|
abrt, _smi_line;
|
||||||
|
|
||||||
int _cycles, _in_smm;
|
int _cycles, _fpu_cycles, _in_smm;
|
||||||
|
|
||||||
uint16_t npxs, npxc;
|
uint16_t npxs, npxc;
|
||||||
|
|
||||||
@@ -457,6 +457,7 @@ COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128)
|
|||||||
#define DI cpu_state.regs[7].w
|
#define DI cpu_state.regs[7].w
|
||||||
|
|
||||||
#define cycles cpu_state._cycles
|
#define cycles cpu_state._cycles
|
||||||
|
#define fpu_cycles cpu_state._fpu_cycles
|
||||||
|
|
||||||
#define cpu_rm cpu_state.rm_data.rm_mod_reg.rm
|
#define cpu_rm cpu_state.rm_data.rm_mod_reg.rm
|
||||||
#define cpu_mod cpu_state.rm_data.rm_mod_reg.mod
|
#define cpu_mod cpu_state.rm_data.rm_mod_reg.mod
|
||||||
|
@@ -12,7 +12,8 @@ static int opFADD ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
if ((cpu_state.npxc >> 10) & 3) \
|
if ((cpu_state.npxc >> 10) & 3) \
|
||||||
fesetround(FE_TONEAREST); \
|
fesetround(FE_TONEAREST); \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd ## cycle_postfix) : ((x87_concurrency.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -24,7 +25,8 @@ static int opFCOM ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
cpu_state.npxs &= ~(C0|C2|C3); \
|
cpu_state.npxs &= ~(C0|C2|C3); \
|
||||||
cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
|
cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom ## cycle_postfix) : ((x87_timings.fcom ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom ## cycle_postfix) : ((x87_timings.fcom ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom ## cycle_postfix) : ((x87_concurrency.fcom ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -37,7 +39,8 @@ static int opFCOMP ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
cpu_state.npxs &= ~(C0|C2|C3); \
|
cpu_state.npxs &= ~(C0|C2|C3); \
|
||||||
cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
|
cpu_state.npxs |= x87_compare(ST(0), (double)use_var); \
|
||||||
x87_pop(); \
|
x87_pop(); \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom ## cycle_postfix) : ((x87_timings.fcom ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom ## cycle_postfix) : ((x87_timings.fcom ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom ## cycle_postfix) : ((x87_concurrency.fcom ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -49,7 +52,8 @@ static int opFDIV ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
x87_div(ST(0), ST(0), use_var); \
|
x87_div(ST(0), ST(0), use_var); \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv ## cycle_postfix) : ((x87_timings.fdiv ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv ## cycle_postfix) : ((x87_timings.fdiv ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd ## cycle_postfix) : ((x87_concurrency.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -61,7 +65,8 @@ static int opFDIVR ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
x87_div(ST(0), use_var, ST(0)); \
|
x87_div(ST(0), use_var, ST(0)); \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv ## cycle_postfix) : ((x87_timings.fdiv ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv ## cycle_postfix) : ((x87_timings.fdiv ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv ## cycle_postfix) : ((x87_concurrency.fdiv ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -73,7 +78,8 @@ static int opFMUL ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
ST(0) *= use_var; \
|
ST(0) *= use_var; \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fmul ## cycle_postfix) : ((x87_timings.fmul ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fmul ## cycle_postfix) : ((x87_timings.fmul ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fmul ## cycle_postfix) : ((x87_concurrency.fmul ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -85,7 +91,8 @@ static int opFSUB ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
ST(0) -= use_var; \
|
ST(0) -= use_var; \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd ## cycle_postfix) : ((x87_concurrency.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
||||||
@@ -97,7 +104,8 @@ static int opFSUBR ## name ## _a ## a_size(uint32_t fetchdat) \
|
|||||||
load_var = get(); if (cpu_state.abrt) return 1; \
|
load_var = get(); if (cpu_state.abrt) return 1; \
|
||||||
ST(0) = use_var - ST(0); \
|
ST(0) = use_var - ST(0); \
|
||||||
FP_TAG_VALID; \
|
FP_TAG_VALID; \
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd ## cycle_postfix) : ((x87_timings.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd ## cycle_postfix) : ((x87_concurrency.fadd ## cycle_postfix) * cpu_multi)); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +135,8 @@ static int opFADD(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = ST(0) + ST(fetchdat & 7);
|
ST(0) = ST(0) + ST(fetchdat & 7);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFADDr(uint32_t fetchdat)
|
static int opFADDr(uint32_t fetchdat)
|
||||||
@@ -136,7 +145,8 @@ static int opFADDr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFADDP(uint32_t fetchdat)
|
static int opFADDP(uint32_t fetchdat)
|
||||||
@@ -146,7 +156,8 @@ static int opFADDP(uint32_t fetchdat)
|
|||||||
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) + ST(0);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +168,8 @@ static int opFCOM(uint32_t fetchdat)
|
|||||||
cpu_state.npxs &= ~(C0|C2|C3);
|
cpu_state.npxs &= ~(C0|C2|C3);
|
||||||
if (ST(0) == ST(fetchdat & 7)) cpu_state.npxs |= C3;
|
if (ST(0) == ST(fetchdat & 7)) cpu_state.npxs |= C3;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) cpu_state.npxs |= C0;
|
else if (ST(0) < ST(fetchdat & 7)) cpu_state.npxs |= C0;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom) : (x87_concurrency.fcom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +180,8 @@ static int opFCOMP(uint32_t fetchdat)
|
|||||||
cpu_state.npxs &= ~(C0|C2|C3);
|
cpu_state.npxs &= ~(C0|C2|C3);
|
||||||
cpu_state.npxs |= x87_compare(ST(0), ST(fetchdat & 7));
|
cpu_state.npxs |= x87_compare(ST(0), ST(fetchdat & 7));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom) : (x87_concurrency.fcom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,7 +200,8 @@ static int opFCOMPP(uint32_t fetchdat)
|
|||||||
|
|
||||||
x87_pop();
|
x87_pop();
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom) : (x87_concurrency.fcom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -199,7 +213,8 @@ static int opFUCOMPP(uint32_t fetchdat)
|
|||||||
cpu_state.npxs |= x87_ucompare(ST(0), ST(1));
|
cpu_state.npxs |= x87_ucompare(ST(0), ST(1));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fucom) : (x87_concurrency.fucom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,7 +226,8 @@ static int opFCOMI(uint32_t fetchdat)
|
|||||||
cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG);
|
cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG);
|
||||||
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom) : (x87_concurrency.fcom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFCOMIP(uint32_t fetchdat)
|
static int opFCOMIP(uint32_t fetchdat)
|
||||||
@@ -223,7 +239,8 @@ static int opFCOMIP(uint32_t fetchdat)
|
|||||||
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fcom) : (x87_timings.fcom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fcom) : (x87_concurrency.fcom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -234,7 +251,8 @@ static int opFDIV(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_div(ST(0), ST(0), ST(fetchdat & 7));
|
x87_div(ST(0), ST(0), ST(fetchdat & 7));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVr(uint32_t fetchdat)
|
static int opFDIVr(uint32_t fetchdat)
|
||||||
@@ -243,7 +261,8 @@ static int opFDIVr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVP(uint32_t fetchdat)
|
static int opFDIVP(uint32_t fetchdat)
|
||||||
@@ -253,7 +272,8 @@ static int opFDIVP(uint32_t fetchdat)
|
|||||||
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
x87_div(ST(fetchdat & 7), ST(fetchdat & 7), ST(0));
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,7 +283,8 @@ static int opFDIVR(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_div(ST(0), ST(fetchdat&7), ST(0));
|
x87_div(ST(0), ST(fetchdat&7), ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVRr(uint32_t fetchdat)
|
static int opFDIVRr(uint32_t fetchdat)
|
||||||
@@ -272,7 +293,8 @@ static int opFDIVRr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFDIVRP(uint32_t fetchdat)
|
static int opFDIVRP(uint32_t fetchdat)
|
||||||
@@ -282,7 +304,8 @@ static int opFDIVRP(uint32_t fetchdat)
|
|||||||
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
x87_div(ST(fetchdat & 7), ST(0), ST(fetchdat & 7));
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fdiv) : (x87_timings.fdiv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fdiv) : (x87_concurrency.fdiv * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +315,8 @@ static int opFMUL(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = ST(0) * ST(fetchdat & 7);
|
ST(0) = ST(0) * ST(fetchdat & 7);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fmul) : (x87_concurrency.fmul * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFMULr(uint32_t fetchdat)
|
static int opFMULr(uint32_t fetchdat)
|
||||||
@@ -301,7 +325,8 @@ static int opFMULr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fmul) : (x87_concurrency.fmul * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFMULP(uint32_t fetchdat)
|
static int opFMULP(uint32_t fetchdat)
|
||||||
@@ -311,7 +336,8 @@ static int opFMULP(uint32_t fetchdat)
|
|||||||
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) * ST(fetchdat & 7);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fmul) : (x87_timings.fmul * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fmul) : (x87_concurrency.fmul * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +347,8 @@ static int opFSUB(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = ST(0) - ST(fetchdat & 7);
|
ST(0) = ST(0) - ST(fetchdat & 7);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBr(uint32_t fetchdat)
|
static int opFSUBr(uint32_t fetchdat)
|
||||||
@@ -330,7 +357,8 @@ static int opFSUBr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBP(uint32_t fetchdat)
|
static int opFSUBP(uint32_t fetchdat)
|
||||||
@@ -340,7 +368,8 @@ static int opFSUBP(uint32_t fetchdat)
|
|||||||
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
ST(fetchdat & 7) = ST(fetchdat & 7) - ST(0);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,7 +379,8 @@ static int opFSUBR(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = ST(fetchdat & 7) - ST(0);
|
ST(0) = ST(fetchdat & 7) - ST(0);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBRr(uint32_t fetchdat)
|
static int opFSUBRr(uint32_t fetchdat)
|
||||||
@@ -359,7 +389,8 @@ static int opFSUBRr(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFSUBRP(uint32_t fetchdat)
|
static int opFSUBRP(uint32_t fetchdat)
|
||||||
@@ -369,7 +400,8 @@ static int opFSUBRP(uint32_t fetchdat)
|
|||||||
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
ST(fetchdat & 7) = ST(0) - ST(fetchdat & 7);
|
||||||
FP_TAG_VALID_F;
|
FP_TAG_VALID_F;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fadd) : (x87_timings.fadd * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fadd) : (x87_concurrency.fadd * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,7 +412,8 @@ static int opFUCOM(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
cpu_state.npxs &= ~(C0|C2|C3);
|
cpu_state.npxs &= ~(C0|C2|C3);
|
||||||
cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
|
cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fucom) : (x87_concurrency.fucom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,7 +424,8 @@ static int opFUCOMP(uint32_t fetchdat)
|
|||||||
cpu_state.npxs &= ~(C0|C2|C3);
|
cpu_state.npxs &= ~(C0|C2|C3);
|
||||||
cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
|
cpu_state.npxs |= x87_ucompare(ST(0), ST(fetchdat & 7));
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fucom) : (x87_concurrency.fucom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,7 +437,8 @@ static int opFUCOMI(uint32_t fetchdat)
|
|||||||
cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG);
|
cpu_state.flags &= ~(Z_FLAG | P_FLAG | C_FLAG);
|
||||||
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fucom) : (x87_concurrency.fucom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int opFUCOMIP(uint32_t fetchdat)
|
static int opFUCOMIP(uint32_t fetchdat)
|
||||||
@@ -415,7 +450,8 @@ static int opFUCOMIP(uint32_t fetchdat)
|
|||||||
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
if (ST(0) == ST(fetchdat & 7)) cpu_state.flags |= Z_FLAG;
|
||||||
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
else if (ST(0) < ST(fetchdat & 7)) cpu_state.flags |= C_FLAG;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fucom) : (x87_timings.fucom * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fucom) : (x87_concurrency.fucom * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -23,7 +23,8 @@ static int opFILDiw_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
temp = geteaw(); if (cpu_state.abrt) return 1;
|
temp = geteaw(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)temp);
|
x87_push((double)temp);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_16) : (x87_timings.fild_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_16) : (x87_timings.fild_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_16) : (x87_concurrency.fild_16 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -35,7 +36,8 @@ static int opFILDiw_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
temp = geteaw(); if (cpu_state.abrt) return 1;
|
temp = geteaw(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)temp);
|
x87_push((double)temp);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_16) : (x87_timings.fild_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_16) : (x87_timings.fild_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_16) : (x87_concurrency.fild_16 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -46,7 +48,8 @@ static int opFISTiw_a16(uint32_t fetchdat)
|
|||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(x87_fround16(ST(0)));
|
seteaw(x87_fround16(ST(0)));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_16) : (x87_concurrency.fist_16 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -56,7 +59,8 @@ static int opFISTiw_a32(uint32_t fetchdat)
|
|||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(x87_fround16(ST(0)));
|
seteaw(x87_fround16(ST(0)));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_16) : (x87_concurrency.fist_16 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -68,7 +72,8 @@ static int opFISTPiw_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(x87_fround16(ST(0))); if (cpu_state.abrt) return 1;
|
seteaw(x87_fround16(ST(0))); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_16) : (x87_concurrency.fist_16 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -79,7 +84,8 @@ static int opFISTPiw_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(x87_fround16(ST(0))); if (cpu_state.abrt) return 1;
|
seteaw(x87_fround16(ST(0))); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_16) : (x87_timings.fist_16 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_16) : (x87_concurrency.fist_16 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -95,7 +101,8 @@ static int opFILDiq_a16(uint32_t fetchdat)
|
|||||||
cpu_state.MM[cpu_state.TOP&7].q = temp64;
|
cpu_state.MM[cpu_state.TOP&7].q = temp64;
|
||||||
FP_TAG_DEFAULT;
|
FP_TAG_DEFAULT;
|
||||||
|
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_64) : (x87_timings.fild_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_64) : (x87_timings.fild_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_64) : (x87_concurrency.fild_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -110,7 +117,8 @@ static int opFILDiq_a32(uint32_t fetchdat)
|
|||||||
cpu_state.MM[cpu_state.TOP&7].q = temp64;
|
cpu_state.MM[cpu_state.TOP&7].q = temp64;
|
||||||
FP_TAG_DEFAULT;
|
FP_TAG_DEFAULT;
|
||||||
|
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_64) : (x87_timings.fild_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_64) : (x87_timings.fild_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_64) : (x87_concurrency.fild_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -139,7 +147,8 @@ static int FBSTP_a16(uint32_t fetchdat)
|
|||||||
if (ST(0) < 0.0) tempc |= 0x80;
|
if (ST(0) < 0.0) tempc |= 0x80;
|
||||||
writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
|
writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fbstp) : (x87_timings.fbstp * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fbstp) : (x87_timings.fbstp * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fbstp) : (x87_concurrency.fbstp * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -167,7 +176,7 @@ static int FBSTP_a32(uint32_t fetchdat)
|
|||||||
if (ST(0) < 0.0) tempc |= 0x80;
|
if (ST(0) < 0.0) tempc |= 0x80;
|
||||||
writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
|
writememb(easeg, cpu_state.eaaddr + 9, tempc); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fbstp) : (x87_timings.fbstp * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fbstp) : (x87_timings.fbstp * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -184,7 +193,8 @@ static int FISTPiq_a16(uint32_t fetchdat)
|
|||||||
temp64 = x87_fround(ST(0));
|
temp64 = x87_fround(ST(0));
|
||||||
seteaq(temp64); if (cpu_state.abrt) return 1;
|
seteaq(temp64); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_64) : (x87_timings.fist_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_64) : (x87_timings.fist_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_64) : (x87_concurrency.fist_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -200,7 +210,8 @@ static int FISTPiq_a32(uint32_t fetchdat)
|
|||||||
temp64 = x87_fround(ST(0));
|
temp64 = x87_fround(ST(0));
|
||||||
seteaq(temp64); if (cpu_state.abrt) return 1;
|
seteaq(temp64); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_64) : (x87_timings.fist_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_64) : (x87_timings.fist_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_64) : (x87_concurrency.fist_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -213,7 +224,8 @@ static int opFILDil_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
templ = geteal(); if (cpu_state.abrt) return 1;
|
templ = geteal(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)templ);
|
x87_push((double)templ);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_32) : (x87_timings.fild_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_32) : (x87_timings.fild_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_32) : (x87_concurrency.fild_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -225,7 +237,8 @@ static int opFILDil_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
templ = geteal(); if (cpu_state.abrt) return 1;
|
templ = geteal(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)templ);
|
x87_push((double)templ);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fild_32) : (x87_timings.fild_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fild_32) : (x87_timings.fild_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fild_32) : (x87_concurrency.fild_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -236,7 +249,8 @@ static int opFISTil_a16(uint32_t fetchdat)
|
|||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteal(x87_fround32(ST(0)));
|
seteal(x87_fround32(ST(0)));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_32) : (x87_concurrency.fist_32 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -246,7 +260,8 @@ static int opFISTil_a32(uint32_t fetchdat)
|
|||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteal(x87_fround32(ST(0)));
|
seteal(x87_fround32(ST(0)));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_32) : (x87_concurrency.fist_32 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -258,7 +273,8 @@ static int opFISTPil_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteal(x87_fround32(ST(0))); if (cpu_state.abrt) return 1;
|
seteal(x87_fround32(ST(0))); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_32) : (x87_concurrency.fist_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -269,7 +285,8 @@ static int opFISTPil_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteal(x87_fround32(ST(0))); if (cpu_state.abrt) return 1;
|
seteal(x87_fround32(ST(0))); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fist_32) : (x87_timings.fist_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fist_32) : (x87_concurrency.fist_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -282,7 +299,8 @@ static int opFLDe_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
t=x87_ld80(); if (cpu_state.abrt) return 1;
|
t=x87_ld80(); if (cpu_state.abrt) return 1;
|
||||||
x87_push(t);
|
x87_push(t);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_80) : (x87_concurrency.fld_80 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -294,7 +312,8 @@ static int opFLDe_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
t=x87_ld80(); if (cpu_state.abrt) return 1;
|
t=x87_ld80(); if (cpu_state.abrt) return 1;
|
||||||
x87_push(t);
|
x87_push(t);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_80) : (x87_concurrency.fld_80 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -306,7 +325,8 @@ static int opFSTPe_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
x87_st80(ST(0)); if (cpu_state.abrt) return 1;
|
x87_st80(ST(0)); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_80) : (x87_concurrency.fld_80 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -317,7 +337,8 @@ static int opFSTPe_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
x87_st80(ST(0)); if (cpu_state.abrt) return 1;
|
x87_st80(ST(0)); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_80) : (x87_timings.fld_80 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_80) : (x87_concurrency.fld_80 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -330,7 +351,8 @@ static int opFLDd_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
t.i = geteaq(); if (cpu_state.abrt) return 1;
|
t.i = geteaq(); if (cpu_state.abrt) return 1;
|
||||||
x87_push(t.d);
|
x87_push(t.d);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_64) : (x87_timings.fld_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_64) : (x87_timings.fld_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_64) : (x87_concurrency.fld_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -342,7 +364,8 @@ static int opFLDd_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
t.i = geteaq(); if (cpu_state.abrt) return 1;
|
t.i = geteaq(); if (cpu_state.abrt) return 1;
|
||||||
x87_push(t.d);
|
x87_push(t.d);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_64) : (x87_timings.fld_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_64) : (x87_timings.fld_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_64) : (x87_concurrency.fld_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -355,7 +378,8 @@ static int opFSTd_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i);
|
seteaq(t.i);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_64) : (x87_concurrency.fst_64 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -367,7 +391,8 @@ static int opFSTd_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i);
|
seteaq(t.i);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_64) : (x87_concurrency.fst_64 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -381,7 +406,8 @@ static int opFSTPd_a16(uint32_t fetchdat)
|
|||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i); if (cpu_state.abrt) return 1;
|
seteaq(t.i); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_64) : (x87_concurrency.fst_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -394,7 +420,8 @@ static int opFSTPd_a32(uint32_t fetchdat)
|
|||||||
t.d = ST(0);
|
t.d = ST(0);
|
||||||
seteaq(t.i); if (cpu_state.abrt) return 1;
|
seteaq(t.i); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_64) : (x87_timings.fst_64 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_64) : (x87_concurrency.fst_64 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -407,7 +434,8 @@ static int opFLDs_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
ts.i = geteal(); if (cpu_state.abrt) return 1;
|
ts.i = geteal(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)ts.s);
|
x87_push((double)ts.s);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -419,7 +447,8 @@ static int opFLDs_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||||
ts.i = geteal(); if (cpu_state.abrt) return 1;
|
ts.i = geteal(); if (cpu_state.abrt) return 1;
|
||||||
x87_push((double)ts.s);
|
x87_push((double)ts.s);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -432,7 +461,8 @@ static int opFSTs_a16(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i);
|
seteal(ts.i);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -444,7 +474,8 @@ static int opFSTs_a32(uint32_t fetchdat)
|
|||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i);
|
seteal(ts.i);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -458,7 +489,8 @@ static int opFSTPs_a16(uint32_t fetchdat)
|
|||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i); if (cpu_state.abrt) return 1;
|
seteal(ts.i); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -471,7 +503,8 @@ static int opFSTPs_a32(uint32_t fetchdat)
|
|||||||
ts.s = (float)ST(0);
|
ts.s = (float)ST(0);
|
||||||
seteal(ts.i); if (cpu_state.abrt) return 1;
|
seteal(ts.i); if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst_32) : (x87_timings.fst_32 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst_32) : (x87_concurrency.fst_32 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -15,7 +15,8 @@ static int opFSTSW_AX(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
AX = cpu_state.npxs;
|
AX = cpu_state.npxs;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstcw_sw) : (x87_concurrency.fstcw_sw * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -25,7 +26,8 @@ static int opFNOP(uint32_t fetchdat)
|
|||||||
{
|
{
|
||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fnop) : (x87_concurrency.fnop * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +36,8 @@ static int opFCLEX(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
cpu_state.npxs &= 0xff00;
|
cpu_state.npxs &= 0xff00;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fnop) : (x87_concurrency.fnop * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +61,8 @@ static int opFINIT(uint32_t fetchdat)
|
|||||||
#endif
|
#endif
|
||||||
cpu_state.TOP = 0;
|
cpu_state.TOP = 0;
|
||||||
cpu_state.ismmx = 0;
|
cpu_state.ismmx = 0;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.finit) : (x87_timings.finit * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.finit) : (x87_timings.finit * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.finit) : (x87_concurrency.finit * cpu_multi));
|
||||||
CPU_BLOCK_END();
|
CPU_BLOCK_END();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -73,7 +77,8 @@ static int opFFREE(uint32_t fetchdat)
|
|||||||
#else
|
#else
|
||||||
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3;
|
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3;
|
||||||
#endif
|
#endif
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.ffree) : (x87_timings.ffree * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.ffree) : (x87_timings.ffree * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.ffree) : (x87_concurrency.ffree * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +88,8 @@ static int opFFREEP(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3; if (cpu_state.abrt) return 1;
|
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = 3; if (cpu_state.abrt) return 1;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.ffree) : (x87_timings.ffree * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.ffree) : (x87_timings.ffree * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.ffree) : (x87_concurrency.ffree * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +99,8 @@ static int opFST(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(fetchdat & 7) = ST(0);
|
ST(fetchdat & 7) = ST(0);
|
||||||
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
|
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst) : (x87_timings.fst * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst) : (x87_timings.fst * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst) : (x87_concurrency.fst * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +111,8 @@ static int opFSTP(uint32_t fetchdat)
|
|||||||
ST(fetchdat & 7) = ST(0);
|
ST(fetchdat & 7) = ST(0);
|
||||||
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
|
cpu_state.tag[(cpu_state.TOP + fetchdat) & 7] = cpu_state.tag[cpu_state.TOP & 7];
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fst) : (x87_timings.fst * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fst) : (x87_timings.fst * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fst) : (x87_concurrency.fst * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +168,8 @@ static int FSTOR()
|
|||||||
#endif
|
#endif
|
||||||
cpu_state.ismmx = 1;
|
cpu_state.ismmx = 1;
|
||||||
|
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.frstor) : (x87_timings.frstor * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.frstor) : (x87_timings.frstor * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.frstor) : (x87_concurrency.frstor * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
static int opFSTOR_a16(uint32_t fetchdat)
|
static int opFSTOR_a16(uint32_t fetchdat)
|
||||||
@@ -330,7 +339,8 @@ static int FSAVE()
|
|||||||
cpu_state.TOP = 0;
|
cpu_state.TOP = 0;
|
||||||
cpu_state.ismmx = 0;
|
cpu_state.ismmx = 0;
|
||||||
|
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fsave) : (x87_timings.fsave * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fsave) : (x87_timings.fsave * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fsave) : (x87_concurrency.fsave * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
static int opFSAVE_a16(uint32_t fetchdat)
|
static int opFSAVE_a16(uint32_t fetchdat)
|
||||||
@@ -358,7 +368,8 @@ static int opFSTSW_a16(uint32_t fetchdat)
|
|||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw((cpu_state.npxs & 0xC7FF) | ((cpu_state.TOP & 7) << 11));
|
seteaw((cpu_state.npxs & 0xC7FF) | ((cpu_state.TOP & 7) << 11));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstcw_sw) : (x87_concurrency.fstcw_sw * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -368,7 +379,8 @@ static int opFSTSW_a32(uint32_t fetchdat)
|
|||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw((cpu_state.npxs & 0xC7FF) | ((cpu_state.TOP & 7) << 11));
|
seteaw((cpu_state.npxs & 0xC7FF) | ((cpu_state.TOP & 7) << 11));
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstcw_sw) : (x87_concurrency.fstcw_sw * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -386,7 +398,8 @@ static int opFLD(uint32_t fetchdat)
|
|||||||
x87_push(ST(fetchdat&7));
|
x87_push(ST(fetchdat&7));
|
||||||
cpu_state.tag[cpu_state.TOP&7] = old_tag;
|
cpu_state.tag[cpu_state.TOP&7] = old_tag;
|
||||||
cpu_state.MM[cpu_state.TOP&7].q = old_i64;
|
cpu_state.MM[cpu_state.TOP&7].q = old_i64;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld) : (x87_timings.fld * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld) : (x87_timings.fld * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld) : (x87_concurrency.fld * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,7 +420,8 @@ static int opFXCH(uint32_t fetchdat)
|
|||||||
cpu_state.MM[cpu_state.TOP&7].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q;
|
cpu_state.MM[cpu_state.TOP&7].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q;
|
||||||
cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q = old_i64;
|
cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q = old_i64;
|
||||||
|
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fxch) : (x87_timings.fxch * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fxch) : (x87_timings.fxch * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fxch) : (x87_concurrency.fxch * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,7 +431,8 @@ static int opFCHS(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = -ST(0);
|
ST(0) = -ST(0);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fchs) : (x87_timings.fchs * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fchs) : (x87_timings.fchs * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fchs) : (x87_concurrency.fchs * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,7 +442,8 @@ static int opFABS(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = fabs(ST(0));
|
ST(0) = fabs(ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fabs) : (x87_timings.fabs * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fabs) : (x87_timings.fabs * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fabs) : (x87_concurrency.fabs * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +454,8 @@ static int opFTST(uint32_t fetchdat)
|
|||||||
cpu_state.npxs &= ~(C0|C2|C3);
|
cpu_state.npxs &= ~(C0|C2|C3);
|
||||||
if (ST(0) == 0.0) cpu_state.npxs |= C3;
|
if (ST(0) == 0.0) cpu_state.npxs |= C3;
|
||||||
else if (ST(0) < 0.0) cpu_state.npxs |= C0;
|
else if (ST(0) < 0.0) cpu_state.npxs |= C0;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.ftst) : (x87_timings.ftst * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.ftst) : (x87_timings.ftst * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.ftst) : (x87_concurrency.ftst * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,7 +472,8 @@ static int opFXAM(uint32_t fetchdat)
|
|||||||
else if (ST(0) == 0.0) cpu_state.npxs |= C3;
|
else if (ST(0) == 0.0) cpu_state.npxs |= C3;
|
||||||
else cpu_state.npxs |= C2;
|
else cpu_state.npxs |= C2;
|
||||||
if (ST(0) < 0.0) cpu_state.npxs |= C1;
|
if (ST(0) < 0.0) cpu_state.npxs |= C1;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fxam) : (x87_timings.fxam * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fxam) : (x87_timings.fxam * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fxam) : (x87_concurrency.fxam * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,7 +482,8 @@ static int opFLD1(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(1.0);
|
x87_push(1.0);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_z1) : (x87_timings.fld_z1 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_z1) : (x87_timings.fld_z1 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_z1) : (x87_concurrency.fld_z1 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -473,7 +492,8 @@ static int opFLDL2T(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(3.3219280948873623);
|
x87_push(3.3219280948873623);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_const) : (x87_concurrency.fld_const * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,7 +502,8 @@ static int opFLDL2E(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(1.4426950408889634);
|
x87_push(1.4426950408889634);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_const) : (x87_concurrency.fld_const * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,7 +512,8 @@ static int opFLDPI(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(3.141592653589793);
|
x87_push(3.141592653589793);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_const) : (x87_concurrency.fld_const * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,7 +522,8 @@ static int opFLDEG2(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(0.3010299956639812);
|
x87_push(0.3010299956639812);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_const) : (x87_concurrency.fld_const * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,7 +532,8 @@ static int opFLDLN2(uint32_t fetchdat)
|
|||||||
FP_ENTER();
|
FP_ENTER();
|
||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push_u64(0x3fe62e42fefa39f0ull);
|
x87_push_u64(0x3fe62e42fefa39f0ull);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_const) : (x87_timings.fld_const * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_const) : (x87_concurrency.fld_const * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,7 +543,8 @@ static int opFLDZ(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
x87_push(0.0);
|
x87_push(0.0);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fld_z1) : (x87_timings.fld_z1 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fld_z1) : (x87_timings.fld_z1 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fld_z1) : (x87_concurrency.fld_z1 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,7 +554,8 @@ static int opF2XM1(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = pow(2.0, ST(0)) - 1.0;
|
ST(0) = pow(2.0, ST(0)) - 1.0;
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.f2xm1) : (x87_timings.f2xm1 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.f2xm1) : (x87_timings.f2xm1 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.f2xm1) : (x87_concurrency.f2xm1 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,7 +566,8 @@ static int opFYL2X(uint32_t fetchdat)
|
|||||||
ST(1) = ST(1) * (log(ST(0)) / log(2.0));
|
ST(1) = ST(1) * (log(ST(0)) / log(2.0));
|
||||||
FP_TAG_VALID_N;
|
FP_TAG_VALID_N;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fyl2x) : (x87_timings.fyl2x * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fyl2x) : (x87_timings.fyl2x * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fyl2x) : (x87_concurrency.fyl2x * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -551,7 +578,8 @@ static int opFYL2XP1(uint32_t fetchdat)
|
|||||||
ST(1) = ST(1) * (log1p(ST(0)) / log(2.0));
|
ST(1) = ST(1) * (log1p(ST(0)) / log(2.0));
|
||||||
FP_TAG_VALID_N;
|
FP_TAG_VALID_N;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fyl2xp1) : (x87_timings.fyl2xp1 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fyl2xp1) : (x87_timings.fyl2xp1 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fyl2xp1) : (x87_concurrency.fyl2xp1 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -563,7 +591,8 @@ static int opFPTAN(uint32_t fetchdat)
|
|||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
x87_push(1.0);
|
x87_push(1.0);
|
||||||
cpu_state.npxs &= ~C2;
|
cpu_state.npxs &= ~C2;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fptan) : (x87_timings.fptan * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fptan) : (x87_timings.fptan * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fptan) : (x87_concurrency.fptan * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,7 +603,8 @@ static int opFPATAN(uint32_t fetchdat)
|
|||||||
ST(1) = atan2(ST(1), ST(0));
|
ST(1) = atan2(ST(1), ST(0));
|
||||||
FP_TAG_VALID_N;
|
FP_TAG_VALID_N;
|
||||||
x87_pop();
|
x87_pop();
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fpatan) : (x87_timings.fpatan * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fpatan) : (x87_timings.fpatan * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fpatan) : (x87_concurrency.fpatan * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -587,7 +617,8 @@ static int opFDECSTP(uint32_t fetchdat)
|
|||||||
#else
|
#else
|
||||||
cpu_state.TOP = (cpu_state.TOP - 1) & 7;
|
cpu_state.TOP = (cpu_state.TOP - 1) & 7;
|
||||||
#endif
|
#endif
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fincdecstp) : (x87_timings.fincdecstp * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fincdecstp) : (x87_timings.fincdecstp * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fincdecstp) : (x87_concurrency.fincdecstp * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -600,7 +631,8 @@ static int opFINCSTP(uint32_t fetchdat)
|
|||||||
#else
|
#else
|
||||||
cpu_state.TOP = (cpu_state.TOP + 1) & 7;
|
cpu_state.TOP = (cpu_state.TOP + 1) & 7;
|
||||||
#endif
|
#endif
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fincdecstp) : (x87_timings.fincdecstp * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fincdecstp) : (x87_timings.fincdecstp * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fincdecstp) : (x87_concurrency.fincdecstp * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -616,7 +648,8 @@ static int opFPREM(uint32_t fetchdat)
|
|||||||
if (temp64 & 4) cpu_state.npxs|=C0;
|
if (temp64 & 4) cpu_state.npxs|=C0;
|
||||||
if (temp64 & 2) cpu_state.npxs|=C3;
|
if (temp64 & 2) cpu_state.npxs|=C3;
|
||||||
if (temp64 & 1) cpu_state.npxs|=C1;
|
if (temp64 & 1) cpu_state.npxs|=C1;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fprem) : (x87_timings.fprem * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fprem) : (x87_timings.fprem * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fprem) : (x87_concurrency.fprem * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -632,7 +665,8 @@ static int opFPREM1(uint32_t fetchdat)
|
|||||||
if (temp64 & 4) cpu_state.npxs|=C0;
|
if (temp64 & 4) cpu_state.npxs|=C0;
|
||||||
if (temp64 & 2) cpu_state.npxs|=C3;
|
if (temp64 & 2) cpu_state.npxs|=C3;
|
||||||
if (temp64 & 1) cpu_state.npxs|=C1;
|
if (temp64 & 1) cpu_state.npxs|=C1;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fprem1) : (x87_timings.fprem1 * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fprem1) : (x87_timings.fprem1 * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fprem1) : (x87_concurrency.fprem1 * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -643,7 +677,8 @@ static int opFSQRT(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = sqrt(ST(0));
|
ST(0) = sqrt(ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fsqrt) : (x87_timings.fsqrt * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fsqrt) : (x87_timings.fsqrt * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fsqrt) : (x87_concurrency.fsqrt * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,7 +693,8 @@ static int opFSINCOS(uint32_t fetchdat)
|
|||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
x87_push(cos(td));
|
x87_push(cos(td));
|
||||||
cpu_state.npxs &= ~C2;
|
cpu_state.npxs &= ~C2;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fsincos) : (x87_timings.fsincos * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fsincos) : (x87_timings.fsincos * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fsincos) : (x87_concurrency.fsincos * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -669,7 +705,8 @@ static int opFRNDINT(uint32_t fetchdat)
|
|||||||
cpu_state.pc++;
|
cpu_state.pc++;
|
||||||
ST(0) = (double)x87_fround(ST(0));
|
ST(0) = (double)x87_fround(ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.frndint) : (x87_timings.frndint * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.frndint) : (x87_timings.frndint * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.frndint) : (x87_concurrency.frndint * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,7 +719,8 @@ static int opFSCALE(uint32_t fetchdat)
|
|||||||
if(ST(0) != 0.0)
|
if(ST(0) != 0.0)
|
||||||
ST(0) = ST(0) * pow(2.0, (double)temp64);
|
ST(0) = ST(0) * pow(2.0, (double)temp64);
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fscale) : (x87_timings.fscale * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fscale) : (x87_timings.fscale * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fscale) : (x87_concurrency.fscale * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,7 +732,8 @@ static int opFSIN(uint32_t fetchdat)
|
|||||||
ST(0) = sin(ST(0));
|
ST(0) = sin(ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
cpu_state.npxs &= ~C2;
|
cpu_state.npxs &= ~C2;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fsin_cos) : (x87_timings.fsin_cos * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fsin_cos) : (x87_timings.fsin_cos * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fsin_cos) : (x87_concurrency.fsin_cos * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -705,7 +744,8 @@ static int opFCOS(uint32_t fetchdat)
|
|||||||
ST(0) = cos(ST(0));
|
ST(0) = cos(ST(0));
|
||||||
FP_TAG_VALID;
|
FP_TAG_VALID;
|
||||||
cpu_state.npxs &= ~C2;
|
cpu_state.npxs &= ~C2;
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fsin_cos) : (x87_timings.fsin_cos * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fsin_cos) : (x87_timings.fsin_cos * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fsin_cos) : (x87_concurrency.fsin_cos * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -733,7 +773,8 @@ static int FLDENV()
|
|||||||
cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
|
cpu_state.TOP = (cpu_state.npxs >> 11) & 7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fldenv) : (x87_timings.fldenv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fldenv) : (x87_timings.fldenv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fldenv) : (x87_concurrency.fldenv * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -766,7 +807,8 @@ static int opFLDCW_a16(uint32_t fetchdat)
|
|||||||
if (cpu_state.abrt) return 1;
|
if (cpu_state.abrt) return 1;
|
||||||
cpu_state.npxc = tempw;
|
cpu_state.npxc = tempw;
|
||||||
codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3);
|
codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fldcw) : (x87_timings.fldcw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fldcw) : (x87_timings.fldcw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fldcw) : (x87_concurrency.fldcw * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -780,7 +822,8 @@ static int opFLDCW_a32(uint32_t fetchdat)
|
|||||||
if (cpu_state.abrt) return 1;
|
if (cpu_state.abrt) return 1;
|
||||||
cpu_state.npxc = tempw;
|
cpu_state.npxc = tempw;
|
||||||
codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3);
|
codegen_set_rounding_mode((cpu_state.npxc >> 10) & 3);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fldcw) : (x87_timings.fldcw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fldcw) : (x87_timings.fldcw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fldcw) : (x87_concurrency.fldcw * cpu_multi));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -826,7 +869,8 @@ static int FSTENV()
|
|||||||
writememl(easeg,cpu_state.eaaddr+24,x87_op_seg);
|
writememl(easeg,cpu_state.eaaddr+24,x87_op_seg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstenv) : (x87_timings.fstenv * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstenv) : (x87_timings.fstenv * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstenv) : (x87_concurrency.fstenv * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -855,7 +899,8 @@ static int opFSTCW_a16(uint32_t fetchdat)
|
|||||||
fetch_ea_16(fetchdat);
|
fetch_ea_16(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(cpu_state.npxc);
|
seteaw(cpu_state.npxc);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstenv) : (x87_concurrency.fstenv * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#ifndef FPU_8087
|
#ifndef FPU_8087
|
||||||
@@ -865,7 +910,8 @@ static int opFSTCW_a32(uint32_t fetchdat)
|
|||||||
fetch_ea_32(fetchdat);
|
fetch_ea_32(fetchdat);
|
||||||
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
SEG_CHECK_WRITE(cpu_state.ea_seg);
|
||||||
seteaw(cpu_state.npxc);
|
seteaw(cpu_state.npxc);
|
||||||
CLOCK_CYCLES((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fstcw_sw) : (x87_timings.fstcw_sw * cpu_multi));
|
||||||
|
CONCURRENCY_CYCLES((fpu_type >= FPU_487SX) ? (x87_concurrency.fstcw_sw) : (x87_concurrency.fstcw_sw * cpu_multi));
|
||||||
return cpu_state.abrt;
|
return cpu_state.abrt;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -882,7 +928,7 @@ static int opFSTCW_a32(uint32_t fetchdat)
|
|||||||
cpu_state.MM[cpu_state.TOP&7].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; \
|
cpu_state.MM[cpu_state.TOP&7].q = cpu_state.MM[(cpu_state.TOP + fetchdat) & 7].q; \
|
||||||
ST(0) = ST(fetchdat & 7); \
|
ST(0) = ST(fetchdat & 7); \
|
||||||
} \
|
} \
|
||||||
CLOCK_CYCLES(4); \
|
CLOCK_CYCLES_FPU(4); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "x87_timings.h"
|
#include "x87_timings.h"
|
||||||
|
|
||||||
x87_timings_t x87_timings;
|
x87_timings_t x87_timings;
|
||||||
|
x87_timings_t x87_concurrency;
|
||||||
|
|
||||||
const x87_timings_t x87_timings_8087 =
|
const x87_timings_t x87_timings_8087 =
|
||||||
{
|
{
|
||||||
@@ -313,3 +314,157 @@ const x87_timings_t x87_timings_486 =
|
|||||||
.fyl2x = (196 + 329) / 2,
|
.fyl2x = (196 + 329) / 2,
|
||||||
.fyl2xp1 = (171 + 326) / 2
|
.fyl2xp1 = (171 + 326) / 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* this should be used for FPUs with no concurrency.
|
||||||
|
some pre-486DX Cyrix FPUs reportedly are like this. */
|
||||||
|
const x87_timings_t x87_concurrency_none =
|
||||||
|
{
|
||||||
|
.f2xm1 = 0,
|
||||||
|
.fabs = 0,
|
||||||
|
.fadd = 0,
|
||||||
|
.fadd_32 = 0,
|
||||||
|
.fadd_64 = 0,
|
||||||
|
.fbld = 0,
|
||||||
|
.fbstp = 0,
|
||||||
|
.fchs = 0,
|
||||||
|
.fclex = 0,
|
||||||
|
.fcom = 0,
|
||||||
|
.fcom_32 = 0,
|
||||||
|
.fcom_64 = 0,
|
||||||
|
.fcos = 0,
|
||||||
|
.fincdecstp = 0,
|
||||||
|
.fdisi_eni = 0,
|
||||||
|
.fdiv = 0,
|
||||||
|
.fdiv_32 = 0,
|
||||||
|
.fdiv_64 = 0,
|
||||||
|
.ffree = 0,
|
||||||
|
.fadd_i16 = 0,
|
||||||
|
.fadd_i32 = 0,
|
||||||
|
.fcom_i16 = 0,
|
||||||
|
.fcom_i32 = 0,
|
||||||
|
.fdiv_i16 = 0,
|
||||||
|
.fdiv_i32 = 0,
|
||||||
|
.fild_16 = 0,
|
||||||
|
.fild_32 = 0,
|
||||||
|
.fild_64 = 0,
|
||||||
|
.fmul_i16 = 0,
|
||||||
|
.fmul_i32 = 0,
|
||||||
|
.finit = 0,
|
||||||
|
.fist_16 = 0,
|
||||||
|
.fist_32 = 0,
|
||||||
|
.fist_64 = 0,
|
||||||
|
.fld = 0,
|
||||||
|
.fld_32 = 0,
|
||||||
|
.fld_64 = 0,
|
||||||
|
.fld_80 = 0,
|
||||||
|
.fld_z1 = 0,
|
||||||
|
.fld_const = 0,
|
||||||
|
.fldcw = 0,
|
||||||
|
.fldenv = 0,
|
||||||
|
.fmul = 0,
|
||||||
|
.fmul_32 = 0,
|
||||||
|
.fmul_64 = 0,
|
||||||
|
.fnop = 0,
|
||||||
|
.fpatan = 0,
|
||||||
|
.fprem = 0,
|
||||||
|
.fprem1 = 0,
|
||||||
|
.fptan = 0,
|
||||||
|
.frndint = 0,
|
||||||
|
.frstor = 0,
|
||||||
|
.fsave = 0,
|
||||||
|
.fscale = 0,
|
||||||
|
.fsetpm = 0,
|
||||||
|
.fsin_cos = 0,
|
||||||
|
.fsincos = 0,
|
||||||
|
.fsqrt = 0,
|
||||||
|
.fst = 0,
|
||||||
|
.fst_32 = 0,
|
||||||
|
.fst_64 = 0,
|
||||||
|
.fst_80 = 0,
|
||||||
|
.fstcw_sw = 0,
|
||||||
|
.fstenv = 0,
|
||||||
|
.ftst = 0,
|
||||||
|
.fucom = 0,
|
||||||
|
.fwait = 0,
|
||||||
|
.fxam = 0,
|
||||||
|
.fxch = 0,
|
||||||
|
.fxtract = 0,
|
||||||
|
.fyl2x = 0,
|
||||||
|
.fyl2xp1 = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const x87_timings_t x87_concurrency_486 =
|
||||||
|
{
|
||||||
|
.f2xm1 = 2,
|
||||||
|
.fabs = 0,
|
||||||
|
.fadd = 7,
|
||||||
|
.fadd_32 = 7,
|
||||||
|
.fadd_64 = 7,
|
||||||
|
.fbld = 8,
|
||||||
|
.fbstp = 0,
|
||||||
|
.fchs = 0,
|
||||||
|
.fclex = 0,
|
||||||
|
.fcom = 1,
|
||||||
|
.fcom_32 = 1,
|
||||||
|
.fcom_64 = 1,
|
||||||
|
.fcos = 2,
|
||||||
|
.fincdecstp = 0,
|
||||||
|
.fdisi_eni = 0,
|
||||||
|
.fdiv = 70,
|
||||||
|
.fdiv_32 = 70,
|
||||||
|
.fdiv_64 = 70,
|
||||||
|
.ffree = 0,
|
||||||
|
.fadd_i16 = 7,
|
||||||
|
.fadd_i32 = 7,
|
||||||
|
.fcom_i16 = 1,
|
||||||
|
.fcom_i32 = 1,
|
||||||
|
.fdiv_i16 = 70,
|
||||||
|
.fdiv_i32 = 70,
|
||||||
|
.fild_16 = 4,
|
||||||
|
.fild_32 = 4,
|
||||||
|
.fild_64 = 8,
|
||||||
|
.fmul_i16 = 8,
|
||||||
|
.fmul_i32 = 8,
|
||||||
|
.finit = 0,
|
||||||
|
.fist_16 = 0,
|
||||||
|
.fist_32 = 0,
|
||||||
|
.fist_64 = 0,
|
||||||
|
.fld = 0,
|
||||||
|
.fld_32 = 0,
|
||||||
|
.fld_64 = 0,
|
||||||
|
.fld_80 = 0,
|
||||||
|
.fld_z1 = 0,
|
||||||
|
.fld_const = 2,
|
||||||
|
.fldcw = 0,
|
||||||
|
.fldenv = 0,
|
||||||
|
.fmul = 13,
|
||||||
|
.fmul_32 = 8,
|
||||||
|
.fmul_64 = 11,
|
||||||
|
.fnop = 0,
|
||||||
|
.fpatan = 5,
|
||||||
|
.fprem = 2,
|
||||||
|
.fprem1 = 6,
|
||||||
|
.fptan = 70,
|
||||||
|
.frndint = 0,
|
||||||
|
.frstor = 0,
|
||||||
|
.fsave = 0,
|
||||||
|
.fscale = 2,
|
||||||
|
.fsetpm = 0,
|
||||||
|
.fsin_cos = 2,
|
||||||
|
.fsincos = 2,
|
||||||
|
.fsqrt = 70,
|
||||||
|
.fst = 0,
|
||||||
|
.fst_32 = 0,
|
||||||
|
.fst_64 = 0,
|
||||||
|
.fst_80 = 0,
|
||||||
|
.fstcw_sw = 0,
|
||||||
|
.fstenv = 0,
|
||||||
|
.ftst = 1,
|
||||||
|
.fucom = 1,
|
||||||
|
.fwait = 0,
|
||||||
|
.fxam = 0,
|
||||||
|
.fxch = 0,
|
||||||
|
.fxtract = 4,
|
||||||
|
.fyl2x = 13,
|
||||||
|
.fyl2xp1 = 13,
|
||||||
|
};
|
@@ -53,4 +53,7 @@ extern const x87_timings_t x87_timings_287;
|
|||||||
extern const x87_timings_t x87_timings_387;
|
extern const x87_timings_t x87_timings_387;
|
||||||
extern const x87_timings_t x87_timings_486;
|
extern const x87_timings_t x87_timings_486;
|
||||||
|
|
||||||
|
extern const x87_timings_t x87_concurrency_486;
|
||||||
|
|
||||||
extern x87_timings_t x87_timings;
|
extern x87_timings_t x87_timings;
|
||||||
|
extern x87_timings_t x87_concurrency;
|
Reference in New Issue
Block a user