FPU: Re-enabled SoftFloat on 808x and implement the missing FBLD instruction, closes #4300.
This commit is contained in:
@@ -144,6 +144,89 @@ opFILDiq_a32(uint32_t fetchdat)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
FBLD_a16(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t load_reg_hi = 0xffff;
|
||||
uint64_t load_reg_lo = BX_CONST64(0xC000000000000000);
|
||||
int64_t load_val = 0ULL;
|
||||
uint64_t power;
|
||||
int sign;
|
||||
|
||||
FP_ENTER();
|
||||
fetch_ea_16(fetchdat);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
load_reg_lo = readmemq(easeg, cpu_state.eaaddr);
|
||||
load_reg_hi = readmemw(easeg, cpu_state.eaaddr + 8);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
clear_C1();
|
||||
sign = (load_reg_hi & 0x8000) != 0;
|
||||
load_val = 0ULL;
|
||||
power = 1;
|
||||
for (int i = 0; i < 16; i++) {
|
||||
load_val += ((uint64_t) (load_reg_lo & 0xf)) * power;
|
||||
load_reg_lo >>= 4;
|
||||
power *= 10;
|
||||
}
|
||||
for (int i = 0; i < 2; i++) {
|
||||
load_val += ((uint64_t) (load_reg_hi & 0xf)) * power;
|
||||
load_reg_hi >>= 4;
|
||||
power *= 10;
|
||||
}
|
||||
if (sign)
|
||||
load_val = -load_val;
|
||||
x87_push((double) load_val);
|
||||
cpu_state.MM[cpu_state.TOP & 7].q = load_val;
|
||||
FP_TAG_DEFAULT;
|
||||
|
||||
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;
|
||||
}
|
||||
#ifndef FPU_8087
|
||||
static int
|
||||
FBLD_a32(uint32_t fetchdat)
|
||||
{
|
||||
uint16_t load_reg_hi = 0xffff;
|
||||
uint64_t load_reg_lo = BX_CONST64(0xC000000000000000);
|
||||
int64_t load_val = 0ULL;
|
||||
uint64_t power;
|
||||
int sign;
|
||||
|
||||
FP_ENTER();
|
||||
fetch_ea_32(fetchdat);
|
||||
SEG_CHECK_READ(cpu_state.ea_seg);
|
||||
load_reg_lo = readmemq(easeg, cpu_state.eaaddr);
|
||||
load_reg_hi = readmemw(easeg, cpu_state.eaaddr + 8);
|
||||
if (cpu_state.abrt)
|
||||
return 1;
|
||||
clear_C1();
|
||||
sign = (load_reg_hi & 0x8000) != 0;
|
||||
load_val = 0ULL;
|
||||
power = 1;
|
||||
for (int i = 0; i < 16; i++) {
|
||||
load_val += ((uint64_t) (load_reg_lo & 0xf)) * power;
|
||||
load_reg_lo >>= 4;
|
||||
power *= 10;
|
||||
}
|
||||
for (int i = 0; i < 2; i++) {
|
||||
load_val += ((uint64_t) (load_reg_hi & 0xf)) * power;
|
||||
load_reg_hi >>= 4;
|
||||
power *= 10;
|
||||
}
|
||||
if (sign)
|
||||
load_val = -load_val;
|
||||
x87_push((double) load_val);
|
||||
cpu_state.MM[cpu_state.TOP & 7].q = load_val;
|
||||
FP_TAG_DEFAULT;
|
||||
|
||||
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;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
FBSTP_a16(uint32_t fetchdat)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user