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.

Reply via email to