unicorn/qemu
Joseph Myers cf54c51869 target/i386: fix IEEE SSE floating-point exception raising
The SSE instruction implementations all fail to raise the expected
IEEE floating-point exceptions because they do nothing to convert the
exception state from the softfloat machinery into the exception flags
in MXCSR.

Fix this by adding such conversions. Unlike for x87, emulated SSE
floating-point operations might be optimized using hardware floating
point on the host, and so a different approach is taken that is
compatible with such optimizations. The required invariant is that
all exceptions set in env->sse_status (other than "denormal operand",
for which the SSE semantics are different from those in the softfloat
code) are ones that are set in the MXCSR; the emulated MXCSR is
updated lazily when code reads MXCSR, while when code sets MXCSR, the
exceptions in env->sse_status are set accordingly.

A few instructions do not raise all the exceptions that would be
raised by the softfloat code, and those instructions are made to save
and restore the softfloat exception state accordingly.

Nothing is done about "denormal operand"; setting that (only for the
case when input denormals are *not* flushed to zero, the opposite of
the logic in the softfloat code for such an exception) will require
custom code for relevant instructions, or else architecture-specific
conditionals in the softfloat code for when to set such an exception
together with custom code for various SSE conversion and rounding
instructions that do not set that exception.

Nothing is done about trapping exceptions (for which there is minimal
and largely broken support in QEMU's emulation in the x87 case and no
support at all in the SSE case).

Backports commit 418b0f93d12a1589d5031405de857844f32e9ccc from qemu
2021-02-25 23:21:32 -05:00
..
accel target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
crypto
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,m68k: disable floatx80_invalid_encoding() for m68k 2021-02-25 23:14:47 -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: fix IEEE SSE floating-point exception raising 2021-02-25 23:21:32 -05:00
tcg tcg: Fix do_nonatomic_op_* vs signed operations 2021-02-25 23:10:40 -05:00
util util/cutils: Turn FIXME comment into QEMU_BUILD_BUG_ON() 2020-01-14 08:04:30 -05:00
aarch64.h target/arm: Fix temp double-free in sve ldr/str 2021-02-25 23:10:37 -05:00
aarch64eb.h target/arm: Fix temp double-free in sve ldr/str 2021-02-25 23:10:37 -05:00
accel.c clean-up: removed duplicate #includes 2018-02-28 08:51:56 -05:00
arm.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
armeb.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -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 target/arm: Fix temp double-free in sve ldr/str 2021-02-25 23:10:37 -05:00
ioport.c hw: remove pio_addr_t 2018-02-24 02:43:16 -05:00
LICENSE
m68k.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -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
mips.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
mips64.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
mips64el.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
mipsel.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
powerpc.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
qemu-timer.c timer/cpus: fix some typos and update some comments 2018-02-25 23:21:57 -05:00
riscv32.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
riscv64.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
rules.mak build-sys: silence make by default or V=0 2018-03-06 08:58:03 -05:00
sparc.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00
sparc64.h target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -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 target/arm: Add sve infrastructure for page lookup 2021-02-25 20:28:23 -05:00