qemu/tests/tcg/i386
Joseph Myers 418b0f93d1 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).

Signed-off-by: Joseph Myers <joseph@codesourcery.com>
Message-Id: <alpine.DEB.2.21.2006252358000.3832@digraph.polyomino.org.uk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-07-10 18:02:17 -04:00
..
system
Makefile.softmmu-target
Makefile.target target/i386: fix IEEE SSE floating-point exception raising 2020-07-10 18:02:17 -04:00
README
hello-i386.c
test-i386-code16.S
test-i386-f2xm1.c target/i386: reimplement f2xm1 using floatx80 operations 2020-06-26 09:39:37 -04:00
test-i386-fbstp.c
test-i386-fisttp.c
test-i386-fldcst.c
test-i386-fp-exceptions.c
test-i386-fpatan.c target/i386: reimplement fpatan using floatx80 operations 2020-06-26 09:39:39 -04:00
test-i386-fprem.c
test-i386-fscale.c
test-i386-fxam.c
test-i386-fxtract.c
test-i386-fyl2x.c target/i386: reimplement fyl2x using floatx80 operations 2020-06-26 09:39:39 -04:00
test-i386-fyl2xp1.c target/i386: reimplement fyl2xp1 using floatx80 operations 2020-06-26 09:39:38 -04:00
test-i386-muldiv.h
test-i386-pcmpistri.c target/i386: correct fix for pcmpxstrx substring search 2020-06-12 11:10:39 -04:00
test-i386-pseudo-denormal.c
test-i386-shift.h
test-i386-snan-convert.c
test-i386-sse-exceptions.c target/i386: fix IEEE SSE floating-point exception raising 2020-07-10 18:02:17 -04:00
test-i386-ssse3.c
test-i386-vm86.S
test-i386.c
test-i386.h

README

These are i386 specific guest programs

test-i386
---------

This program executes most of the 16 bit and 32 bit x86 instructions and
generates a text output, for comparison with the output obtained with
a real CPU or another emulator.

The Linux system call modify_ldt() is used to create x86 selectors
to test some 16 bit addressing and 32 bit with segmentation cases.

The Linux system call vm86() is used to test vm86 emulation.

Various exceptions are raised to test most of the x86 user space
exception reporting.

linux-test
----------

This program tests various Linux system calls. It is used to verify
that the system call parameters are correctly converted between target
and host CPUs.

test-i386-fprem
---------------

test-mmap
---------

sha1
----

hello-i386
----------