about summary refs log tree commit diff
path: root/sysdeps/libm-ieee754/s_fpclassifyl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-ieee754/s_fpclassifyl.c')
-rw-r--r--sysdeps/libm-ieee754/s_fpclassifyl.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sysdeps/libm-ieee754/s_fpclassifyl.c b/sysdeps/libm-ieee754/s_fpclassifyl.c
index d7a0e943cf..4df0b44f75 100644
--- a/sysdeps/libm-ieee754/s_fpclassifyl.c
+++ b/sysdeps/libm-ieee754/s_fpclassifyl.c
@@ -2,6 +2,7 @@
    Copyright (C) 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+   Fixed by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -26,19 +27,18 @@
 int
 __fpclassifyl (long double x)
 {
-  u_int32_t ex, hx, lx;
+  u_int32_t ex, hx, lx, m;
   int retval = FP_NORMAL;
 
   GET_LDOUBLE_WORDS (ex, hx, lx, x);
-  hx &= 0x7fffffff;
-  hx |= lx;
+  m = (hx & 0x7fffffff) | lx;
   ex &= 0x7fff;
-  if ((ex | hx) == 0)
+  if ((ex | m) == 0)
     retval = FP_ZERO;
-  else if (ex == 0)
+  else if (ex == 0 && (hx & 0x80000000) == 0)
     retval = FP_SUBNORMAL;
   else if (ex == 0x7fff)
-    retval = hx != 0 ? FP_NAN : FP_INFINITE;
+    retval = m != 0 ? FP_NAN : FP_INFINITE;
 
   return retval;
 }