summaryrefslogtreecommitdiff
path: root/libquadmath
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-02-19 22:50:10 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-02-19 22:50:10 +0100
commitd6988187cd6778a81425a3825f6331abac918485 (patch)
tree0a56eeaa86b23e2a68e438f912be999cf85d9fb6 /libquadmath
parent406defcb58e60a2c7093700fbc27ae13a9b32d86 (diff)
re PR libquadmath/56379 (libquadmath: Wrong result for strtoflt128.c if compiled with -O0)
PR libquadmath/56379 * strtod/strtod_l.c (mpn_lshift_1): Rewritten as function-like macro. From-SVN: r196155
Diffstat (limited to 'libquadmath')
-rw-r--r--libquadmath/ChangeLog6
-rw-r--r--libquadmath/strtod/strtod_l.c44
2 files changed, 29 insertions, 21 deletions
diff --git a/libquadmath/ChangeLog b/libquadmath/ChangeLog
index 3c293cfac5e..15c0739319d 100644
--- a/libquadmath/ChangeLog
+++ b/libquadmath/ChangeLog
@@ -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.
diff --git a/libquadmath/strtod/strtod_l.c b/libquadmath/strtod/strtod_l.c
index d1845a8039c..0b0e85a3cf7 100644
--- a/libquadmath/strtod/strtod_l.c
+++ b/libquadmath/strtod/strtod_l.c
@@ -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)