unicorn/qemu
Joseph Myers ac2f3fa0f2 target/i386: reimplement fyl2xp1 using floatx80 operations
The x87 fyl2xp1 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 (adding 1 then using log rather than
attempting a better emulation using log1p).

Reimplement using the soft-float operations, as was done for f2xm1; as
in that case, m68k has related operations but not exactly this one and
it seemed safest to implement directly rather than reusing the m68k
code to avoid accumulation of errors.

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 y * log2(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.

Intel manuals describe a narrower range of valid arguments to this
instruction than AMD manuals. The implementation accepts the wider
range (it's needed anyway for the core code to be reusable in a
subsequent patch reimplementing fyl2x), but the test only has inputs
in the narrower range so that it's valid on hardware that may reject
or produce poor results for inputs outside that range.

Code in the previous implementation that sets C2 for some out-of-range
arguments is not carried forward to the new implementation; C2 is
undefined for this instruction and I suspect that code was just
cut-and-pasted from the trigonometric instructions (fcos, fptan, fsin,
fsincos) where C2 *is* defined to be set for out-of-range arguments.

Backports commit 5eebc49d2d0aa5fc7e90eeac97533051bb7b72fa from qemu
2021-02-25 13:43:46 -05:00
..
accel unicorn: fix uc_emu_start until if end instruction is in another tlb 2020-08-05 03:18:51 +09:00
crypto crypto: Clean up includes 2018-02-19 00:47:40 -05:00
default-configs target/riscv: Initial introduction of the RISC-V target 2019-03-08 21:46:10 -05:00
docs docs/devel/memory.txt: Document _with_attrs accessors 2018-10-04 04:46:26 -04:00
fpu softfloat: return low bits of quotient from floatx80_modrem 2021-02-25 13:39:10 -05:00
hw Expose different 32-bit ARM CPU models to users via UC_MODE flags (#1165) 2020-01-14 09:37:21 -05:00
include softfloat: return low bits of quotient from floatx80_modrem 2021-02-25 13:39:10 -05:00
qapi qapi: Rewrite string-input-visitor's integer and list parsing 2018-12-18 04:57:25 -05:00
qobject qstring: Move qstring_from_substr()'s @end one to the right 2018-08-02 21:24:19 -04:00
qom cpu: Move icount_decr to CPUNegativeOffsetState 2019-06-13 15:34:28 -04:00
scripts decodetree: Multi-cleanup 2020-06-15 12:49:02 -04:00
target target/i386: reimplement fyl2xp1 using floatx80 operations 2021-02-25 13:43:46 -05:00
tcg tcg: Improve move ops in liveness_pass_2 2020-06-14 22:13:04 -04:00
util util/cutils: Turn FIXME comment into QEMU_BUILD_BUG_ON() 2020-01-14 08:04:30 -05:00
aarch64.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
aarch64eb.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
accel.c clean-up: removed duplicate #includes 2018-02-28 08:51:56 -05:00
arm.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
armeb.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
CODING_STYLE.rst docs: split the CODING_STYLE doc into distinct groups 2019-11-28 02:54:44 -05:00
configure configure: Support -static-pie if requested 2020-04-30 07:09:34 -04:00
COPYING
COPYING.LIB
cpus.c Include qapi/error.h exactly where needed 2018-03-07 12:26:38 -05:00
exec.c Memory: Enable writeback for given memory region 2020-01-14 07:44:24 -05:00
gen_all_header.sh
glib_compat.c target/arm: Add VHE system register redirection and aliasing 2020-03-21 15:57:03 -04:00
header_gen.py softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
ioport.c hw: remove pio_addr_t 2018-02-24 02:43:16 -05:00
LICENSE
m68k.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
Makefile Makefile: Rename targets for make recursion 2019-08-08 17:26:49 -04:00
Makefile.objs qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-09 11:35:11 -05:00
Makefile.target configure: Remove old -fno-gcse workaround for GCC 4.6.x and 4.7.[012] 2018-12-18 03:52:36 -05:00
memory.c Memory: Enable writeback for given memory region 2020-01-14 07:44:24 -05:00
memory_ldst.inc.c memory: Single byte swap along the I/O path 2020-01-07 19:12:04 -05:00
memory_mapping.c include/qemu/osdep.h: Don't include qapi/error.h 2018-02-21 23:08:18 -05:00
mips.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
mips64.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
mips64el.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
mipsel.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
powerpc.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
qemu-timer.c timer/cpus: fix some typos and update some comments 2018-02-25 23:21:57 -05:00
riscv32.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
riscv64.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
rules.mak build-sys: silence make by default or V=0 2018-03-06 08:58:03 -05:00
sparc.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
sparc64.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00
unicorn_common.h unicorn_common: Fix unicorn memory functions failing 2018-09-03 10:40:14 -04:00
VERSION Open 5.1 development tree 2020-04-30 07:30:38 -04:00
vl.c Use cpu_create(type) instead of cpu_init(cpu_model) 2018-03-20 14:20:30 -04:00
vl.h
x86_64.h softfloat: merge floatx80_mod and floatx80_rem 2021-02-25 13:34:05 -05:00