The only issue with FMA instructions is that there are _a lot_ of them (30 opcodes, each of which comes in up to 4 versions depending on VEX.W and VEX.L; a total of 96 possibilities). However, they can be implement with only 6 helpers, two for scalar operations and four for packed operations. (Scalar versions do not do any merging; they only affect the bottom 32 or 64 bits of the output operand. Therefore, there is no separate XMM and YMM of the scalar helpers). First, we can reduce the number of helpers to one third by passing four operands (one output and three inputs); the reordering of which operands go to the multiply and which go to the add is done in emit.c. Second, the different instructions also dispatch to the same softfloat function, so the flags for float32_muladd and float64_muladd are passed in the helper as int arguments, with a little extra complication to handle FMADDSUB and FMSUBADD. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
||
---|---|---|
.. | ||
system | ||
Makefile.softmmu-target | ||
Makefile.target | ||
README | ||
float_convd.conf | ||
float_convs.ref | ||
hello-i386.c | ||
test-3dnow.c | ||
test-avx.c | ||
test-avx.py | ||
test-i386-bmi2.c | ||
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-fpatan.c | ||
test-i386-fprem.c | ||
test-i386-fscale.c | ||
test-i386-fxam.c | ||
test-i386-fxtract.c | ||
test-i386-fyl2x.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-sse-exceptions.c | ||
test-i386-ssse3.c | ||
test-i386-vm86.S | ||
test-i386.c | ||
test-i386.h | ||
test-mmx.c | ||
test-mmx.py | ||
x86.csv |
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. test-avx -------- This program executes most SSE/AVX instructions and generates a text output, for comparison with the output obtained with a real CPU or another emulator. test-avx.h is generate from x86.csv by test-avx.py x86.csv comes from https://github.com/quasilyte/avx512test 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 ----------