Patchwork [committed] Fix libquadmath strtoflt128 at -O0 (PR libquadmath/56379)

login
register
mail settings
Submitter Jakub Jelinek
Date Feb. 19, 2013, 9:51 p.m.
Message ID <20130219215148.GN1215@tucnak.zalov.cz>
Download mbox | patch
Permalink /patch/221902/
State New
Headers show

Comments

Jakub Jelinek - Feb. 19, 2013, 9:51 p.m.
Hi!

I've committed to trunk what has been accepted earlier today for glibc
strtod_l.c, a fix for -O0 compilation of the file.

Bootstrapped/regtested on x86_64-linux and i686-linux.

2013-02-19  Jakub Jelinek  <jakub@redhat.com>

	PR libquadmath/56379
	* strtod/strtod_l.c (mpn_lshift_1): Rewritten as function-like
	macro.


	Jakub

Patch

--- libquadmath/strtod/strtod_l.c
+++ libquadmath/strtod/strtod_l.c
@@ -444,28 +444,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)