This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[COMMITTED] PowerPC: fix hypot/hypotf check for -INF


Testing on POWER4/5/6 I found an issue with recent hypot (-INF, ...) and
PPC code. The fix is trivial: the return FP->INT transformation should
return the absolute value of the number so the following comparison does
not fail for -INF.

---

2013-05-17  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>

	* sysdeps/powerpc/fpu/e_hypot.c (GET_TWO_FLOAT_WORD): Fix test for
	negative infinity on POWER6 or lower.
	* sysdeps/powerpc/fpu/e_hypotf.c (GET_TWO_FLOAT_WORD): Likewise.

--

diff --git a/sysdeps/powerpc/fpu/e_hypot.c b/sysdeps/powerpc/fpu/e_hypot.c
index 5341933..8cf5b02 100644
--- a/sysdeps/powerpc/fpu/e_hypot.c
+++ b/sysdeps/powerpc/fpu/e_hypot.c
@@ -54,13 +54,13 @@ static const double pdnum   = 2.225073858507201e-308;
    ieee_double_shape_type gh_u2;                                  \
    gh_u1.value = (d1);                                            \
    gh_u2.value = (d2);                                            \
-   (i1) = gh_u1.parts.msw;                                        \
-   (i2) = gh_u2.parts.msw;                                        \
+   (i1) = gh_u1.parts.msw & 0x7fffffff;                           \
+   (i2) = gh_u2.parts.msw & 0x7fffffff;                           \
  } while (0)
 
 # define TEST_INF_NAN(x, y)                                      \
  do {                                                            \
-   int32_t hx, hy;                                               \
+   uint32_t hx, hy;                                              \
    GET_TW0_HIGH_WORD(x, y, hx, hy);                              \
    if (hy > hx) {                                                \
      uint32_t ht = hx; hx = hy; hy = ht;                         \
diff --git a/sysdeps/powerpc/fpu/e_hypotf.c b/sysdeps/powerpc/fpu/e_hypotf.c
index 3ccd385..5fc91ee 100644
--- a/sysdeps/powerpc/fpu/e_hypotf.c
+++ b/sysdeps/powerpc/fpu/e_hypotf.c
@@ -46,13 +46,13 @@ static const float two30  = 1.0737418e09;
    ieee_float_shape_type gf_u2;                                  \
    gf_u1.value = (f1);                                           \
    gf_u2.value = (f2);                                           \
-   (i1) = gf_u1.word;                                            \
-   (i2) = gf_u2.word;                                            \
+   (i1) = gf_u1.word & 0x7fffffff;                               \
+   (i2) = gf_u2.word & 0x7fffffff;                               \
  } while (0)
 
 # define TEST_INF_NAN(x, y)                                      \
  do {                                                            \
-   int32_t hx, hy;                                               \
+   uint32_t hx, hy;                                              \
    GET_TWO_FLOAT_WORD(x, y, hx, hy);                             \
    if (hy > hx) {                                                \
      uint32_t ht = hx; hx = hy; hy = ht;                         \
-- 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]