Return INT_MAX for +-Inf.
authordrepper <drepper>
Wed, 6 Jun 2001 12:46:03 +0000 (12:46 +0000)
committerdrepper <drepper>
Wed, 6 Jun 2001 12:46:03 +0000 (12:46 +0000)
sysdeps/i386/fpu/s_ilogb.S
sysdeps/i386/fpu/s_ilogbf.S
sysdeps/i386/fpu/s_ilogbl.S

index 36fb000..68d9c1a 100644 (file)
@@ -9,6 +9,16 @@ RCSID("$NetBSD: s_ilogb.S,v 1.5 1995/10/12 15:53:09 jtc Exp $")
 
 ENTRY(__ilogb)
        fldl    4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+   required to return INT_MAX in ISO C99.
+   -- jakub@redhat.com.  */
+       fxam                    /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f              /* Is +-Inf, jump.  */
+
        fxtract
        pushl   %eax
        fstp    %st
@@ -18,5 +28,9 @@ ENTRY(__ilogb)
        popl    %eax
 
        ret
+
+1:     fstp    %st
+       movl    $0x7fffffff, %eax
+       ret
 END (__ilogb)
 weak_alias (__ilogb, ilogb)
index 54f9d46..521afe2 100644 (file)
@@ -9,6 +9,16 @@ RCSID("$NetBSD: s_ilogbf.S,v 1.4 1995/10/22 20:32:43 pk Exp $")
 
 ENTRY(__ilogbf)
        flds    4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+   required to return INT_MAX in ISO C99.
+   -- jakub@redhat.com.  */
+       fxam                    /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f              /* Is +-Inf, jump.  */
+
        fxtract
        pushl   %eax
        fstp    %st
@@ -18,5 +28,9 @@ ENTRY(__ilogbf)
        popl    %eax
 
        ret
+
+1:     fstp    %st
+       movl    $0x7fffffff, %eax
+       ret
 END (__ilogbf)
 weak_alias (__ilogbf, ilogbf)
index 1dad93a..ed547bd 100644 (file)
@@ -10,6 +10,16 @@ RCSID("$NetBSD: $")
 
 ENTRY(__ilogbl)
        fldt    4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+   required to return INT_MAX in ISO C99.
+   -- jakub@redhat.com.  */
+       fxam                    /* Is NaN or +-Inf?  */
+       fstsw   %ax
+       movb    $0x45, %dh
+       andb    %ah, %dh
+       cmpb    $0x05, %dh
+       je      1f              /* Is +-Inf, jump.  */
+
        fxtract
        pushl   %eax
        fstp    %st
@@ -19,5 +29,9 @@ ENTRY(__ilogbl)
        popl    %eax
 
        ret
+
+1:     fstp    %st
+       movl    $0x7fffffff, %eax
+       ret
 END (__ilogbl)
 weak_alias (__ilogbl, ilogbl)