diff options
Diffstat (limited to 'src/emu/cpu/i386/x87ops.c')
| -rw-r--r-- | src/emu/cpu/i386/x87ops.c | 136 |
1 files changed, 68 insertions, 68 deletions
diff --git a/src/emu/cpu/i386/x87ops.c b/src/emu/cpu/i386/x87ops.c index 21e05057628..c6b9dc4bb85 100644 --- a/src/emu/cpu/i386/x87ops.c +++ b/src/emu/cpu/i386/x87ops.c @@ -2,17 +2,17 @@ x87 FPU emulation - TODO: - - 80-bit precision for F2XM1, FYL2X, FPATAN - - Figure out why SoftFloat trig extensions produce bad values - - Cycle counts for all processors (currently using 486 counts) - - Precision-dependent cycle counts for divide instructions - - Last instruction, operand pointers etc. - - Fix FLDENV, FSTENV, FSAVE, FRSTOR and FPREM - - Status word C2 updates to reflect round up/down - - Handling of invalid and denormal numbers - - Remove redundant operand checks - - Exceptions + TODO: + - 80-bit precision for F2XM1, FYL2X, FPATAN + - Figure out why SoftFloat trig extensions produce bad values + - Cycle counts for all processors (currently using 486 counts) + - Precision-dependent cycle counts for divide instructions + - Last instruction, operand pointers etc. + - Fix FLDENV, FSTENV, FSAVE, FRSTOR and FPREM + - Status word C2 updates to reflect round up/down + - Handling of invalid and denormal numbers + - Remove redundant operand checks + - Exceptions ***************************************************************************/ @@ -2167,7 +2167,7 @@ void x87_fptan(i386_state *cpustate, UINT8 modrm) double x = fx80_to_double(result1); x = tan(x); result1 = double_to_fx80(x); - + cpustate->x87_sw &= ~X87_SW_C2; #endif } @@ -2229,7 +2229,7 @@ void x87_fsin(i386_state *cpustate, UINT8 modrm) double x = fx80_to_double(result); x = sin(x); result = double_to_fx80(x); - + cpustate->x87_sw &= ~X87_SW_C2; #endif } @@ -2262,7 +2262,7 @@ void x87_fcos(i386_state *cpustate, UINT8 modrm) double x = fx80_to_double(result); x = cos(x); result = double_to_fx80(x); - + cpustate->x87_sw &= ~X87_SW_C2; #endif } @@ -2300,13 +2300,13 @@ void x87_fsincos(i386_state *cpustate, UINT8 modrm) cpustate->x87_sw |= X87_SW_C2; #else double s = fx80_to_double(s_result); - double c = fx80_to_double(c_result); + double c = fx80_to_double(c_result); s = sin(s); c = cos(c); - + s_result = double_to_fx80(s); c_result = double_to_fx80(c); - + cpustate->x87_sw &= ~X87_SW_C2; #endif } @@ -4023,38 +4023,38 @@ void x87_fstenv(i386_state *cpustate, UINT8 modrm) WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 2, cpustate->x87_sw); WRITE16(cpustate, ea + 4, cpustate->x87_tw); -// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); break; case 1: // 16-bit protected mode WRITE16(cpustate,ea + 0, cpustate->x87_cw); WRITE16(cpustate,ea + 2, cpustate->x87_sw); WRITE16(cpustate,ea + 4, cpustate->x87_tw); -// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); break; case 2: // 32-bit real mode WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 4, cpustate->x87_sw); WRITE16(cpustate, ea + 8, cpustate->x87_tw); -// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); break; case 3: // 32-bit protected mode WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 4, cpustate->x87_sw); WRITE16(cpustate, ea + 8, cpustate->x87_tw); -// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); -// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); -// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); -// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); break; } @@ -4072,41 +4072,41 @@ void x87_fsave(i386_state *cpustate, UINT8 modrm) WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 2, cpustate->x87_sw); WRITE16(cpustate, ea + 4, cpustate->x87_tw); -// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); ea += 14; break; case 1: // 16-bit protected mode WRITE16(cpustate,ea + 0, cpustate->x87_cw); WRITE16(cpustate,ea + 2, cpustate->x87_sw); WRITE16(cpustate,ea + 4, cpustate->x87_tw); -// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); ea += 14; break; case 2: // 32-bit real mode WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 4, cpustate->x87_sw); WRITE16(cpustate, ea + 8, cpustate->x87_tw); -// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); ea += 28; break; case 3: // 32-bit protected mode WRITE16(cpustate, ea + 0, cpustate->x87_cw); WRITE16(cpustate, ea + 4, cpustate->x87_sw); WRITE16(cpustate, ea + 8, cpustate->x87_tw); -// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); -// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); -// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); -// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); ea += 28; break; } @@ -4128,41 +4128,41 @@ void x87_frstor(i386_state *cpustate, UINT8 modrm) x87_write_cw(cpustate, READ16(cpustate, ea)); cpustate->x87_sw = READ16(cpustate, ea + 2); cpustate->x87_tw = READ16(cpustate, ea + 4); -// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); ea += 14; break; case 1: // 16-bit protected mode x87_write_cw(cpustate, READ16(cpustate, ea)); cpustate->x87_sw = READ16(cpustate, ea + 2); cpustate->x87_tw = READ16(cpustate, ea + 4); -// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); ea += 14; break; case 2: // 32-bit real mode x87_write_cw(cpustate, READ16(cpustate, ea)); cpustate->x87_sw = READ16(cpustate, ea + 4); cpustate->x87_tw = READ16(cpustate, ea + 8); -// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); -// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); -// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); -// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); ea += 28; break; case 3: // 32-bit protected mode x87_write_cw(cpustate, READ16(cpustate, ea)); cpustate->x87_sw = READ16(cpustate, ea + 4); cpustate->x87_tw = READ16(cpustate, ea + 8); -// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); -// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); -// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); -// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); ea += 28; break; } |
