Good job. I will forward to related guys to correct possible error
documents.
Thanks & regards
? 2011-10-29 3:19, Mark H Weaver ??:
Hello all,
Apologies if this has already been addressed, as I am new to this
mailing list and have not had time to search the archives carefully.
I have found and fixed the underlying cause of the illegal instruction
(SIGILL) signals sent to processes that execute some Loongson-specific
floating-point operations (e.g. an madd/msub/nmadd/nmsub instruction
with a quiet NaN or denormalized floating-point input value).
MIPS and Loongson processors only implement the common cases of
floating-point arithmetic operations in hardware. In unusual cases, the
FPU signals an "Unimplemented instruction exception" and relies upon the
OS kernel to emulate the instruction in software.
Linux includes a MIPS floating-point emulator to handle these cases, but
its emulator does not include support for the Loongson variants of
madd/msub/nmadd/nmsub. It also does not include support for the
Loongson operations on "paired-single" floating-point format (vectors of
two single-precision values).
The following patches add support for these instructions to
arch/mips/math-emu. I fixed some other deficiencies in that code as
well, and those fixes are included in separate patches before the
Loongson2f patch.
Note that during testing, I found a mistake in the documentation for the
Loongson 2F. Page 95 of Loongson2FUserGuide.pdf claims that the
paired-single floating-point instructions should use a format (fmt)
field of 11. However, the processor itself does not seem to recognize
instructions with (fmt=11). It seems to be looking for (fmt=22).
That's the case for the Loongson2F in my Yeeloong anyway (which
/proc/cpuinfo identifies as "ICT Loongson-2 V0.3 FPU V0.1").
I also found that the GNU assembler generates instructions with (fmt=22)
for most (but not all) of the paired-single floating-point instructions.
The only exceptions I've found are the Loongson-specific madd.ps,
msub.ps, nmadd.ps, and nmsub.ps instructions, for which GNU as generates
(fmt=11), although that does not work on my Loongson2F. Therefore, I
have also included a patch to GNU binutils (which will also apply to
GDB) to use fmt=22 for those instructions on Loongson2F.
I should note that the documentation for Loongson 2E (not 2F) also
claims that the format field for paired-single instructions should use
fmt=11. I don't know whether this is a mistake or not, since I do not
have access to a Loongson 2E processor with which to test.
Finally, two apologies are in order:
* Ideally I should have added support for the entire set of MIPS 5
floating-point operations, but I did not have time to do that job, nor
do I have a MIPS 5 processor with which to test. Therefore, these
patches address only the Loongson 2F.
* I must admit that I have not tested these patches against the
linux-loongson-community kernel. However, I have tested them against
the linux--2.6.39.1-libre-lemote kernel maintained by Alexandre Oliva,
and there is no significant difference in arch/mips/math-emu between
those two trees.
Comments and suggestions solicited.
Mark
--
You received this message because you are subscribed to the Google Groups
"loongson-dev" group.
To post to this group, send email to loongson-dev@googlegroups.com.
To unsubscribe from this group, send email to
loongson-dev+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/loongson-dev?hl=en.