re PR libquadmath/56379 (libquadmath: Wrong result for strtoflt128.c if compiled...
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Feb 2013 21:50:10 +0000 (22:50 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Feb 2013 21:50:10 +0000 (22:50 +0100)
PR libquadmath/56379
* strtod/strtod_l.c (mpn_lshift_1): Rewritten as function-like
macro.

From-SVN: r196155

libquadmath/ChangeLog
libquadmath/strtod/strtod_l.c

index 3c293cfac5e0eecd5dc2c1b87587256744bf6b11..15c0739319d3720a94ec57bd8bac9de903289890 100644 (file)
@@ -1,3 +1,9 @@
+2013-02-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libquadmath/56379
+       * strtod/strtod_l.c (mpn_lshift_1): Rewritten as function-like
+       macro.
+
 2013-02-17  Tobias Burnus  <burnus@net-b.de>
 
        * math/cacoshq.c (cacoshq): Call signbitq instead of signbit.
index d1845a8039c8cbdcffe12923ecb77d832f5b0eea..0b0e85a3cf7071e74197bfe275a92d48ca1c94c5 100644 (file)
@@ -421,28 +421,30 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
 /* Shift {PTR, SIZE} COUNT bits to the left, and fill the vacated bits
    with the COUNT most significant bits of LIMB.
 
-   Tege doesn't like this function so I have to write it here myself. :)
+   Implemented as a macro, so that __builtin_constant_p works even at -O0.
+
+   Tege doesn't like this macro so I have to write it here myself. :)
    --drepper */
-static inline void
-__attribute ((always_inline))
-mpn_lshift_1 (mp_limb_t *ptr, mp_size_t size, unsigned int count,
-             mp_limb_t limb)
-{
-  if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB)
-    {
-      /* Optimize the case of shifting by exactly a word:
-        just copy words, with no actual bit-shifting.  */
-      mp_size_t i;
-      for (i = size - 1; i > 0; --i)
-       ptr[i] = ptr[i - 1];
-      ptr[0] = limb;
-    }
-  else
-    {
-      (void) mpn_lshift (ptr, ptr, size, count);
-      ptr[0] |= limb >> (BITS_PER_MP_LIMB - count);
-    }
-}
+#define mpn_lshift_1(ptr, size, count, limb) \
+  do                                                                   \
+    {                                                                  \
+      mp_limb_t *__ptr = (ptr);                                                \
+      if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB)   \
+       {                                                               \
+         mp_size_t i;                                                  \
+         for (i = (size) - 1; i > 0; --i)                              \
+           __ptr[i] = __ptr[i - 1];                                    \
+         __ptr[0] = (limb);                                            \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         /* We assume count > 0 && count < BITS_PER_MP_LIMB here.  */  \
+         unsigned int __count = (count);                               \
+         (void) mpn_lshift (__ptr, __ptr, size, __count);              \
+         __ptr[0] |= (limb) >> (BITS_PER_MP_LIMB - __count);           \
+       }                                                               \
+    }                                                                  \
+  while (0)
 
 
 #define INTERNAL(x) INTERNAL1(x)