FastFPE's implementation of the 'cmf' and 'cnf' opcodes incorrectly treat 
+0 and -0 as inequal numbers, which violates IEEE 754.

The enclosed patch fixes this bug by testing for the 
magic exponent that indicates 'zero' before testing the signs of the 
comparison operands.

Minimal test cases that illustrate the problem are at
<http://www.booyaka.com/~paul/arm/fpa11_cmf_tests.tar.gz>.  After patching
with the patch below, the result of the test cases is identical between
NWFPE and FastFPE.  (The test cases are derived from code posted earlier
by Nicholas Clark <[EMAIL PROTECTED]> - thanks!)

This patch applies cleanly against 2.4.19-rmk2 and 2.5.30-rmk1.  (This is
also true for the previous 'lfm' patch.)

Thanks again to Tony Lindgren <[EMAIL PROTECTED]> for his help with 
catching this bug.


- Paul

--- linux-2.4.19-rmk2/arch/arm/fastfpe/CPRT.S   Wed Sep 25 01:38:54 2002
+++ linux-2.4.19-rmk2-pjw/arch/arm/fastfpe/CPRT.S.new   Wed Sep 25 01:36:08 2002
@@ -128,6 +128,10 @@
        cmp     r8,#0x7fffffff
        cmpeq   r4,#0xffffffff
        beq     CPRT_cmf_unordered
+       
+       cmp     r7,#0x80000000  @ zero can be either positive or negative,
+       cmpeq   r8,#0x80000000  @ but +0 is equal to -0 in IEEE 754
+       beq     CPRT_cmf_equal  
 
        cmp     r1,r2
        beq     CPRT_cmf_equalsign








Reply via email to