unicorn/qemu/target/i386
Joseph Myers 2aee4714ab target/i386: reimplement f2xm1 using floatx80 operations
The x87 f2xm1 emulation is currently based around conversion to
double. This is inherently unsuitable for a good emulation of any
floatx80 operation, even before considering that it is a particularly
naive implementation using double (computing with pow and then
subtracting 1 rather than attempting a better emulation using expm1).

Reimplement using the soft-float operations, including additions and
multiplications with higher precision where appropriate to limit
accumulation of errors. I considered reusing some of the m68k code
for transcendental operations, but the instructions don't generally
correspond exactly to x87 operations (for example, m68k has 2^x and
e^x - 1, but not 2^x - 1); to avoid possible accumulation of errors
from applying multiple such operations each rounding to floatx80
precision, I wrote a direct implementation of 2^x - 1 instead. It
would be possible in principle to make the implementation more
efficient by doing the intermediate operations directly with
significands, signs and exponents and not packing / unpacking floatx80
format for each operation, but that would make it significantly more
complicated and it's not clear that's worthwhile; the m68k emulation
doesn't try to do that.

A test is included with many randomly generated inputs. The
assumption of the test is that the result in round-to-nearest mode
should always be one of the two closest floating-point numbers to the
mathematical value of 2^x - 1; the implementation aims to do somewhat
better than that (about 70 correct bits before rounding). I haven't
investigated how accurate hardware is.

Backports commit eca30647fc078f4d9ed1b455bd67960f99dbeb7a from qemu
2021-02-25 13:31:13 -05:00
..
arch_memory_mapping.c target/i386: enable A20 automatically in system management mode 2018-03-03 14:33:09 -05:00
bpt_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-12 11:46:35 -04:00
cc_helper.c Move target-* CPU file into a target/ folder 2018-03-01 22:50:58 -05:00
cc_helper_template.h Move target-* CPU file into a target/ folder 2018-03-01 22:50:58 -05:00
cpu-param.h tcg: Split out target/arch/cpu-param.h 2019-06-10 19:35:46 -04:00
cpu-qom.h i386: Register versioned CPU models 2019-08-08 19:01:35 -04:00
cpu.c various: Remove suspicious '\' character outside of #define in C code 2020-04-30 07:31:45 -04:00
cpu.h target/i386: reimplement f2xm1 using floatx80 operations 2021-02-25 13:31:13 -05:00
excp_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-12 11:46:35 -04:00
fpu_helper.c target/i386: reimplement f2xm1 using floatx80 operations 2021-02-25 13:31:13 -05:00
helper.c target/i386: Use env_cpu, env_archcpu 2019-06-12 11:46:35 -04:00
helper.h target/i386: Implement CPUID_EXT_RDRAND 2019-05-23 15:12:50 -04:00
int_helper.c target/i386: Implement CPUID_EXT_RDRAND 2019-05-23 15:12:50 -04:00
Makefile.objs target/i386: add the CONFIG_TCG into Makefiles 2018-03-03 21:57:22 -05:00
mem_helper.c cpu: Replace ENV_GET_CPU with env_cpu 2019-06-12 11:16:16 -04:00
misc_helper.c target/i386: Fix OUTL debug output 2020-06-15 12:56:33 -04:00
mpx_helper.c target/i386: move cpu_sync_bndcs_hflags() function 2018-03-03 21:41:26 -05:00
ops_sse.h target/i386: reimplement f2xm1 using floatx80 operations 2021-02-25 13:31:13 -05:00
ops_sse_header.h Move target-* CPU file into a target/ folder 2018-03-01 22:50:58 -05:00
seg_helper.c check arguments, return error instead of raising exceptions. (#1125) 2020-01-14 09:00:11 -05:00
shift_helper_template.h Move target-* CPU file into a target/ folder 2018-03-01 22:50:58 -05:00
smm_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-12 11:46:35 -04:00
svm.h target-i386: Add NPT support 2018-07-03 19:52:56 -04:00
svm_helper.c target/i386: Use env_cpu, env_archcpu 2019-06-12 11:46:35 -04:00
topology.h i386: Update new x86_apicid parsing rules with die_offset support 2019-08-08 18:22:03 -04:00
translate.c tcg: TCGMemOp is now accelerator independent MemOp 2019-11-28 03:01:12 -05:00
unicorn.c check arguments, return error instead of raising exceptions. (#1125) 2020-01-14 09:00:11 -05:00
unicorn.h Move target-* CPU file into a target/ folder 2018-03-01 22:50:58 -05:00