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. Signed-off-by: Joseph Myers <joseph@codesourcery.com> Message-Id: <alpine.DEB.2.21.2006172320190.20587@digraph.polyomino.org.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
||
---|---|---|
.. | ||
system | ||
hello-i386.c | ||
Makefile.softmmu-target | ||
Makefile.target | ||
README | ||
test-i386-code16.S | ||
test-i386-f2xm1.c | ||
test-i386-fbstp.c | ||
test-i386-fisttp.c | ||
test-i386-fldcst.c | ||
test-i386-fp-exceptions.c | ||
test-i386-fprem.c | ||
test-i386-fscale.c | ||
test-i386-fxam.c | ||
test-i386-fxtract.c | ||
test-i386-fyl2xp1.c | ||
test-i386-muldiv.h | ||
test-i386-pcmpistri.c | ||
test-i386-pseudo-denormal.c | ||
test-i386-shift.h | ||
test-i386-snan-convert.c | ||
test-i386-ssse3.c | ||
test-i386-vm86.S | ||
test-i386.c | ||
test-i386.h |
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 ----------