summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2009-09-01 10:08:05 +0200
committerAndreas Schwab <schwab@redhat.com>2009-09-01 10:08:05 +0200
commita562fe3cdbb82fae5868e245de31031c19432550 (patch)
tree542c921e7b94c7c35b433f0dce140adbbaf3ec24
parent62f946ade44beeabffb8e91c989ff2bd47293e4c (diff)
parentc2735e958acc6a69daab71fdc463564860f20794 (diff)
downloadglibc-a562fe3cdbb82fae5868e245de31031c19432550.tar.gz
glibc-a562fe3cdbb82fae5868e245de31031c19432550.tar.xz
glibc-a562fe3cdbb82fae5868e245de31031c19432550.zip
Merge commit 'origin/master' into fedora/master
-rw-r--r--ChangeLog22
-rw-r--r--malloc/malloc.c900
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S18
-rw-r--r--stdlib/tst-strtol.c438
-rw-r--r--stdlib/tst-strtoll.c225
-rw-r--r--sysdeps/i386/i686/multiarch/init-arch.c2
-rw-r--r--sysdeps/x86_64/fpu/bits/mathinline.h4
-rw-r--r--sysdeps/x86_64/multiarch/init-arch.c10
9 files changed, 1163 insertions, 461 deletions
diff --git a/ChangeLog b/ChangeLog
index 69024ab20a..c775ac6e1b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2009-08-31  Andreas Schwab  <schwab@redhat.com>
+
+	* sysdeps/x86_64/fpu/bits/mathinline.h: Use __asm instead of asm.
+
+2009-08-31  Ulrich Drepper  <drepper@redhat.com>
+
+	[BZ #10560]
+	* malloc/malloc.c: Add local assert definition to avoid problems with
+	memory allocation in the real one.
+
+2009-08-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* sysdeps/i386/i686/multiarch/init-arch.c (ENABLE_SSSE3_ON_ATOM):
+	Removed.
+	* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): Don't
+	turn off SSSE3 on Atom.
+
+2009-08-28  Ulrich Drepper  <drepper@redhat.com>
+
+	* stdlib/tst-strtol.c (tests): More tests.
+	* stdlib/tst-strtoll.c (tests): Likewise.
+
 2009-08-26  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/ieee754/dbl-64/wordsize-64/s_isinf.c: New file.
diff --git a/malloc/malloc.c b/malloc/malloc.c
index a459a2b89d..79ba6b6f06 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -107,7 +107,7 @@
        and status information.
 
   Minimum allocated size: 4-byte ptrs:  16 bytes    (including 4 overhead)
-                          8-byte ptrs:  24/32 bytes (including, 4/8 overhead)
+			  8-byte ptrs:  24/32 bytes (including, 4/8 overhead)
 
        When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
        ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
@@ -126,7 +126,7 @@
        minimal mmap unit); typically 4096 or 8192 bytes.
 
   Maximum allocated size:  4-byte size_t: 2^32 minus about two pages
-                           8-byte size_t: 2^64 minus about two pages
+			   8-byte size_t: 2^64 minus about two pages
 
        It is assumed that (possibly signed) size_t values suffice to
        represent chunk sizes. `Possibly signed' is due to the fact
@@ -329,7 +329,29 @@ extern "C" {
   or other mallocs available that do this.
 */
 
-#include <assert.h>
+#ifdef NDEBUG
+# define assert(expr) ((void) 0)
+#else
+# define assert(expr) \
+  ((expr)								      \
+   ? ((void) 0)								      \
+   : __malloc_assert (__STRING (expr), __FILE__, __LINE__, __func__))
+
+extern const char *__progname;
+
+static void
+__malloc_assert (const char *assertion, const char *file, unsigned int line,
+		 const char *function)
+{
+  (void) __fxprintf (NULL, "%s%s%s:%u: %s%sAssertion `%s' failed.\n",
+		     __progname, __progname[0] ? ": " : "",
+		     file, line,
+		     function ? function : "", function ? ": " : "",
+		     assertion);
+  fflush (stderr);
+  abort ();
+}
+#endif
 
 
 /*
@@ -1000,17 +1022,17 @@ int      public_mALLOPt();
   arena:     current total non-mmapped bytes allocated from system
   ordblks:   the number of free chunks
   smblks:    the number of fastbin blocks (i.e., small chunks that
-               have been freed but not use resused or consolidated)
+	       have been freed but not use resused or consolidated)
   hblks:     current number of mmapped regions
   hblkhd:    total bytes held in mmapped regions
   usmblks:   the maximum total allocated space. This will be greater
-                than current total if trimming has occurred.
+		than current total if trimming has occurred.
   fsmblks:   total bytes held in fastbin blocks
   uordblks:  current total allocated space (normal or mmapped)
   fordblks:  total free space
   keepcost:  the maximum number of bytes that could ideally be released
-               back to system via malloc_trim. ("ideally" means that
-               it ignores page restrictions etc.)
+	       back to system via malloc_trim. ("ideally" means that
+	       it ignores page restrictions etc.)
 
   Because these fields are ints, but internal bookkeeping may
   be kept as longs, the reported values may wrap around zero and
@@ -1817,17 +1839,17 @@ struct malloc_chunk {
 
 
     chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of previous chunk, if allocated            | |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of chunk, in bytes                       |M|P|
+	    |             Size of previous chunk, if allocated            | |
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    |             Size of chunk, in bytes                       |M|P|
       mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             User data starts here...                          .
-            .                                                               .
-            .             (malloc_usable_size() bytes)                      .
-            .                                                               |
+	    |             User data starts here...                          .
+	    .                                                               .
+	    .             (malloc_usable_size() bytes)                      .
+	    .                                                               |
 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of chunk                                     |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    |             Size of chunk                                     |
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
 
     Where "chunk" is the front of the chunk for the purpose of most of
@@ -1841,20 +1863,20 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     Free chunks are stored in circular doubly-linked lists, and look like this:
 
     chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of previous chunk                            |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    |             Size of previous chunk                            |
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     `head:' |             Size of chunk, in bytes                         |P|
       mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Forward pointer to next chunk in list             |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Back pointer to previous chunk in list            |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Unused space (may be 0 bytes long)                .
-            .                                                               .
-            .                                                               |
+	    |             Forward pointer to next chunk in list             |
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    |             Back pointer to previous chunk in list            |
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    |             Unused space (may be 0 bytes long)                .
+	    .                                                               .
+	    .                                                               |
 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     `foot:' |             Size of chunk, in bytes                           |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+	    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
     The P (PREV_INUSE) bit, stored in the unused low-order bit of the
     chunk size (which is always a multiple of two words), is an in-use
@@ -1875,14 +1897,14 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     The two exceptions to all this are
 
      1. The special chunk `top' doesn't bother using the
-        trailing size field since there is no next contiguous chunk
-        that would have to index off it. After initialization, `top'
-        is forced to always exist.  If it would become less than
-        MINSIZE bytes long, it is replenished.
+	trailing size field since there is no next contiguous chunk
+	that would have to index off it. After initialization, `top'
+	is forced to always exist.  If it would become less than
+	MINSIZE bytes long, it is replenished.
 
      2. Chunks allocated via mmap, which have the second-lowest-order
-        bit M (IS_MMAPPED) set in their size fields.  Because they are
-        allocated one-by-one, each must contain its own trailing size field.
+	bit M (IS_MMAPPED) set in their size fields.  Because they are
+	allocated one-by-one, each must contain its own trailing size field.
 
 */
 
@@ -2155,7 +2177,7 @@ typedef struct malloc_chunk* mbinptr;
  ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
  ((((unsigned long)(sz)) >> 15) <=  4)? 119 + (((unsigned long)(sz)) >> 15): \
  ((((unsigned long)(sz)) >> 18) <=  2)? 124 + (((unsigned long)(sz)) >> 18): \
-                                        126)
+					126)
 
 // XXX It remains to be seen whether it is good to keep the widths of
 // XXX the buckets the same or whether it should be scaled by a factor
@@ -2166,7 +2188,7 @@ typedef struct malloc_chunk* mbinptr;
  ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
  ((((unsigned long)(sz)) >> 15) <=  4)? 119 + (((unsigned long)(sz)) >> 15): \
  ((((unsigned long)(sz)) >> 18) <=  2)? 124 + (((unsigned long)(sz)) >> 18): \
-                                        126)
+					126)
 
 #define largebin_index(sz) \
   (SIZE_SZ == 8 ? largebin_index_64 (sz) : largebin_index_32 (sz))
@@ -2592,8 +2614,8 @@ static void do_check_chunk(av, p) mstate av; mchunkptr p;
     /* Has legal address ... */
     if (p != av->top) {
       if (contiguous(av)) {
-        assert(((char*)p) >= min_address);
-        assert(((char*)p + sz) <= ((char*)(av->top)));
+	assert(((char*)p) >= min_address);
+	assert(((char*)p + sz) <= ((char*)(av->top)));
       }
     }
     else {
@@ -2850,9 +2872,9 @@ static void do_check_malloc_state(mstate av)
       unsigned int binbit = get_binmap(av,i);
       int empty = last(b) == b;
       if (!binbit)
-        assert(empty);
+	assert(empty);
       else if (!empty)
-        assert(binbit);
+	assert(binbit);
     }
 
     for (p = last(b); p != b; p = p->bk) {
@@ -2861,12 +2883,12 @@ static void do_check_malloc_state(mstate av)
       size = chunksize(p);
       total += size;
       if (i >= 2) {
-        /* chunk belongs in bin */
-        idx = bin_index(size);
-        assert(idx == i);
-        /* lists are sorted */
-        assert(p->bk == b ||
-               (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
+	/* chunk belongs in bin */
+	idx = bin_index(size);
+	assert(idx == i);
+	/* lists are sorted */
+	assert(p->bk == b ||
+	       (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
 
 	if (!in_smallbin_range(size))
 	  {
@@ -2894,10 +2916,10 @@ static void do_check_malloc_state(mstate av)
 	assert (p->fd_nextsize == NULL && p->bk_nextsize == NULL);
       /* chunk is followed by a legal chain of inuse chunks */
       for (q = next_chunk(p);
-           (q != av->top && inuse(q) &&
-             (unsigned long)(chunksize(q)) >= MINSIZE);
-           q = next_chunk(q))
-        do_check_inuse_chunk(av, q);
+	   (q != av->top && inuse(q) &&
+	     (unsigned long)(chunksize(q)) >= MINSIZE);
+	   q = next_chunk(q))
+	do_check_inuse_chunk(av, q);
     }
   }
 
@@ -2913,14 +2935,14 @@ static void do_check_malloc_state(mstate av)
   assert(mp_.n_mmaps <= mp_.max_n_mmaps);
 
   assert((unsigned long)(av->system_mem) <=
-         (unsigned long)(av->max_system_mem));
+	 (unsigned long)(av->max_system_mem));
 
   assert((unsigned long)(mp_.mmapped_mem) <=
-         (unsigned long)(mp_.max_mmapped_mem));
+	 (unsigned long)(mp_.max_mmapped_mem));
 
 #ifdef NO_THREADS
   assert((unsigned long)(mp_.max_total_mem) >=
-         (unsigned long)(mp_.mmapped_mem) + (unsigned long)(av->system_mem));
+	 (unsigned long)(mp_.mmapped_mem) + (unsigned long)(av->system_mem));
 #endif
 }
 #endif
@@ -3005,51 +3027,51 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
 
       if (mm != MAP_FAILED) {
 
-        /*
-          The offset to the start of the mmapped region is stored
-          in the prev_size field of the chunk. This allows us to adjust
-          returned start address to meet alignment requirements here
-          and in memalign(), and still be able to compute proper
-          address argument for later munmap in free() and realloc().
-        */
+	/*
+	  The offset to the start of the mmapped region is stored
+	  in the prev_size field of the chunk. This allows us to adjust
+	  returned start address to meet alignment requirements here
+	  and in memalign(), and still be able to compute proper
+	  address argument for later munmap in free() and realloc().
+	*/
 
 #if 1
 	/* For glibc, chunk2mem increases the address by 2*SIZE_SZ and
 	   MALLOC_ALIGN_MASK is 2*SIZE_SZ-1.  Each mmap'ed area is page
 	   aligned and therefore definitely MALLOC_ALIGN_MASK-aligned.  */
-        assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0);
+	assert (((INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK) == 0);
 #else
-        front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
-        if (front_misalign > 0) {
-          correction = MALLOC_ALIGNMENT - front_misalign;
-          p = (mchunkptr)(mm + correction);
-          p->prev_size = correction;
-          set_head(p, (size - correction) |IS_MMAPPED);
-        }
-        else
+	front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
+	if (front_misalign > 0) {
+	  correction = MALLOC_ALIGNMENT - front_misalign;
+	  p = (mchunkptr)(mm + correction);
+	  p->prev_size = correction;
+	  set_head(p, (size - correction) |IS_MMAPPED);
+	}
+	else
 #endif
 	  {
 	    p = (mchunkptr)mm;
 	    set_head(p, size|IS_MMAPPED);
 	  }
 
-        /* update statistics */
+	/* update statistics */
 
-        if (++mp_.n_mmaps > mp_.max_n_mmaps)
-          mp_.max_n_mmaps = mp_.n_mmaps;
+	if (++mp_.n_mmaps > mp_.max_n_mmaps)
+	  mp_.max_n_mmaps = mp_.n_mmaps;
 
-        sum = mp_.mmapped_mem += size;
-        if (sum > (unsigned long)(mp_.max_mmapped_mem))
-          mp_.max_mmapped_mem = sum;
+	sum = mp_.mmapped_mem += size;
+	if (sum > (unsigned long)(mp_.max_mmapped_mem))
+	  mp_.max_mmapped_mem = sum;
 #ifdef NO_THREADS
-        sum += av->system_mem;
-        if (sum > (unsigned long)(mp_.max_total_mem))
-          mp_.max_total_mem = sum;
+	sum += av->system_mem;
+	if (sum > (unsigned long)(mp_.max_total_mem))
+	  mp_.max_total_mem = sum;
 #endif
 
-        check_chunk(av, p);
+	check_chunk(av, p);
 
-        return chunk2mem(p);
+	return chunk2mem(p);
       }
     }
   }
@@ -3069,8 +3091,8 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
   */
 
   assert((old_top == initial_top(av) && old_size == 0) ||
-         ((unsigned long) (old_size) >= MINSIZE &&
-          prev_inuse(old_top) &&
+	 ((unsigned long) (old_size) >= MINSIZE &&
+	  prev_inuse(old_top) &&
 	  ((unsigned long)old_end & pagemask) == 0));
 
   /* Precondition: not enough current space to satisfy nb request */
@@ -3096,7 +3118,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
       arena_mem += old_heap->size - old_heap_size;
 #if 0
       if(mmapped_mem + arena_mem + sbrked_mem > max_total_mem)
-        max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
+	max_total_mem = mmapped_mem + arena_mem + sbrked_mem;
 #endif
       set_head(old_top, (((char *)old_heap + old_heap->size) - (char *)old_top)
 	       | PREV_INUSE);
@@ -3205,17 +3227,17 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
 
       if (mbrk != MAP_FAILED) {
 
-        /* We do not need, and cannot use, another sbrk call to find end */
-        brk = mbrk;
-        snd_brk = brk + size;
-
-        /*
-           Record that we no longer have a contiguous sbrk region.
-           After the first time mmap is used as backup, we do not
-           ever rely on contiguous space since this could incorrectly
-           bridge regions.
-        */
-        set_noncontiguous(av);
+	/* We do not need, and cannot use, another sbrk call to find end */
+	brk = mbrk;
+	snd_brk = brk + size;
+
+	/*
+	   Record that we no longer have a contiguous sbrk region.
+	   After the first time mmap is used as backup, we do not
+	   ever rely on contiguous space since this could incorrectly
+	   bridge regions.
+	*/
+	set_noncontiguous(av);
       }
     }
 #endif
@@ -3242,19 +3264,19 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
       Otherwise, make adjustments:
 
       * If the first time through or noncontiguous, we need to call sbrk
-        just to find out where the end of memory lies.
+	just to find out where the end of memory lies.
 
       * We need to ensure that all returned chunks from malloc will meet
-        MALLOC_ALIGNMENT
+	MALLOC_ALIGNMENT
 
       * If there was an intervening foreign sbrk, we need to adjust sbrk
-        request size to account for fact that we will not be able to
-        combine new space with existing space in old_top.
+	request size to account for fact that we will not be able to
+	combine new space with existing space in old_top.
 
       * Almost all systems internally allocate whole pages at a time, in
-        which case we might as well use the whole last page of request.
-        So we allocate enough more memory to hit a page boundary now,
-        which in turn causes future contiguous calls to page-align.
+	which case we might as well use the whole last page of request.
+	So we allocate enough more memory to hit a page boundary now,
+	which in turn causes future contiguous calls to page-align.
     */
 
     else {
@@ -3270,51 +3292,51 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
 	if (old_size)
 	  av->system_mem += brk - old_end;
 
-        /* Guarantee alignment of first new chunk made from this space */
+	/* Guarantee alignment of first new chunk made from this space */
 
-        front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
-        if (front_misalign > 0) {
+	front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
+	if (front_misalign > 0) {
 
-          /*
-            Skip over some bytes to arrive at an aligned position.
-            We don't need to specially mark these wasted front bytes.
-            They will never be accessed anyway because
-            prev_inuse of av->top (and any chunk created from its start)
-            is always true after initialization.
-          */
+	  /*
+	    Skip over some bytes to arrive at an aligned position.
+	    We don't need to specially mark these wasted front bytes.
+	    They will never be accessed anyway because
+	    prev_inuse of av->top (and any chunk created from its start)
+	    is always true after initialization.
+	  */
 
-          correction = MALLOC_ALIGNMENT - front_misalign;
-          aligned_brk += correction;
-        }
+	  correction = MALLOC_ALIGNMENT - front_misalign;
+	  aligned_brk += correction;
+	}
 
-        /*
-          If this isn't adjacent to existing space, then we will not
-          be able to merge with old_top space, so must add to 2nd request.
-        */
+	/*
+	  If this isn't adjacent to existing space, then we will not
+	  be able to merge with old_top space, so must add to 2nd request.
+	*/
 
-        correction += old_size;
+	correction += old_size;
 
-        /* Extend the end address to hit a page boundary */
-        end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
-        correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
+	/* Extend the end address to hit a page boundary */
+	end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
+	correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
 
-        assert(correction >= 0);
-        snd_brk = (char*)(MORECORE(correction));
+	assert(correction >= 0);
+	snd_brk = (char*)(MORECORE(correction));
 
-        /*
-          If can't allocate correction, try to at least find out current
-          brk.  It might be enough to proceed without failing.
+	/*
+	  If can't allocate correction, try to at least find out current
+	  brk.  It might be enough to proceed without failing.
 
-          Note that if second sbrk did NOT fail, we assume that space
-          is contiguous with first sbrk. This is a safe assumption unless
-          program is multithreaded but doesn't use locks and a foreign sbrk
-          occurred between our first and second calls.
-        */
+	  Note that if second sbrk did NOT fail, we assume that space
+	  is contiguous with first sbrk. This is a safe assumption unless
+	  program is multithreaded but doesn't use locks and a foreign sbrk
+	  occurred between our first and second calls.
+	*/
 
-        if (snd_brk == (char*)(MORECORE_FAILURE)) {
-          correction = 0;
-          snd_brk = (char*)(MORECORE(0));
-        } else {
+	if (snd_brk == (char*)(MORECORE_FAILURE)) {
+	  correction = 0;
+	  snd_brk = (char*)(MORECORE(0));
+	} else {
 	  /* Call the `morecore' hook if necessary.  */
 	  void (*hook) (void) = force_reg (__after_morecore_hook);
 	  if (__builtin_expect (hook != NULL, 0))
@@ -3324,61 +3346,61 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
 
       /* handle non-contiguous cases */
       else {
-        /* MORECORE/mmap must correctly align */
-        assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
+	/* MORECORE/mmap must correctly align */
+	assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
 
-        /* Find out current end of memory */
-        if (snd_brk == (char*)(MORECORE_FAILURE)) {
-          snd_brk = (char*)(MORECORE(0));
-        }
+	/* Find out current end of memory */
+	if (snd_brk == (char*)(MORECORE_FAILURE)) {
+	  snd_brk = (char*)(MORECORE(0));
+	}
       }
 
       /* Adjust top based on results of second sbrk */
       if (snd_brk != (char*)(MORECORE_FAILURE)) {
-        av->top = (mchunkptr)aligned_brk;
-        set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
-        av->system_mem += correction;
-
-        /*
-          If not the first time through, we either have a
-          gap due to foreign sbrk or a non-contiguous region.  Insert a
-          double fencepost at old_top to prevent consolidation with space
-          we don't own. These fenceposts are artificial chunks that are
-          marked as inuse and are in any case too small to use.  We need
-          two to make sizes and alignments work out.
-        */
-
-        if (old_size != 0) {
-          /*
-             Shrink old_top to insert fenceposts, keeping size a
-             multiple of MALLOC_ALIGNMENT. We know there is at least
-             enough space in old_top to do this.
-          */
-          old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
-          set_head(old_top, old_size | PREV_INUSE);
-
-          /*
-            Note that the following assignments completely overwrite
-            old_top when old_size was previously MINSIZE.  This is
-            intentional. We need the fencepost, even if old_top otherwise gets
-            lost.
-          */
-          chunk_at_offset(old_top, old_size            )->size =
-            (2*SIZE_SZ)|PREV_INUSE;
-
-          chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
-            (2*SIZE_SZ)|PREV_INUSE;
-
-          /* If possible, release the rest. */
-          if (old_size >= MINSIZE) {
+	av->top = (mchunkptr)aligned_brk;
+	set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
+	av->system_mem += correction;
+
+	/*
+	  If not the first time through, we either have a
+	  gap due to foreign sbrk or a non-contiguous region.  Insert a
+	  double fencepost at old_top to prevent consolidation with space
+	  we don't own. These fenceposts are artificial chunks that are
+	  marked as inuse and are in any case too small to use.  We need
+	  two to make sizes and alignments work out.
+	*/
+
+	if (old_size != 0) {
+	  /*
+	     Shrink old_top to insert fenceposts, keeping size a
+	     multiple of MALLOC_ALIGNMENT. We know there is at least
+	     enough space in old_top to do this.
+	  */
+	  old_size = (old_size - 4*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
+	  set_head(old_top, old_size | PREV_INUSE);
+
+	  /*
+	    Note that the following assignments completely overwrite
+	    old_top when old_size was previously MINSIZE.  This is
+	    intentional. We need the fencepost, even if old_top otherwise gets
+	    lost.
+	  */
+	  chunk_at_offset(old_top, old_size            )->size =
+	    (2*SIZE_SZ)|PREV_INUSE;
+
+	  chunk_at_offset(old_top, old_size + 2*SIZE_SZ)->size =
+	    (2*SIZE_SZ)|PREV_INUSE;
+
+	  /* If possible, release the rest. */
+	  if (old_size >= MINSIZE) {
 #ifdef ATOMIC_FASTBINS
-            _int_free(av, old_top, 1);
+	    _int_free(av, old_top, 1);
 #else
-            _int_free(av, old_top);
+	    _int_free(av, old_top);
 #endif
-          }
+	  }
 
-        }
+	}
       }
     }
 
@@ -3456,13 +3478,13 @@ static int sYSTRIm(pad, av) size_t pad; mstate av;
     if (current_brk == (char*)(av->top) + top_size) {
 
       /*
-        Attempt to release memory. We ignore MORECORE return value,
-        and instead call again to find out where new end of memory is.
-        This avoids problems if first call releases less than we asked,
-        of if failure somehow altered brk value. (We could still
-        encounter problems if it altered brk in some very bad way,
-        but the only thing we can do is adjust anyway, which will cause
-        some downstream failure.)
+	Attempt to release memory. We ignore MORECORE return value,
+	and instead call again to find out where new end of memory is.
+	This avoids problems if first call releases less than we asked,
+	of if failure somehow altered brk value. (We could still
+	encounter problems if it altered brk in some very bad way,
+	but the only thing we can do is adjust anyway, which will cause
+	some downstream failure.)
       */
 
       MORECORE(-extra);
@@ -3473,15 +3495,15 @@ static int sYSTRIm(pad, av) size_t pad; mstate av;
       new_brk = (char*)(MORECORE(0));
 
       if (new_brk != (char*)MORECORE_FAILURE) {
-        released = (long)(current_brk - new_brk);
-
-        if (released != 0) {
-          /* Success. Adjust top. */
-          av->system_mem -= released;
-          set_head(av->top, (top_size - released) | PREV_INUSE);
-          check_malloc_state(av);
-          return 1;
-        }
+	released = (long)(current_brk - new_brk);
+
+	if (released != 0) {
+	  /* Success. Adjust top. */
+	  av->system_mem -= released;
+	  set_head(av->top, (top_size - released) | PREV_INUSE);
+	  check_malloc_state(av);
+	  return 1;
+	}
       }
     }
   }
@@ -3559,7 +3581,7 @@ mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
     return p;
 
   cp = (char *)mremap((char *)p - offset, size + offset, new_size,
-                      MREMAP_MAYMOVE);
+		      MREMAP_MAYMOVE);
 
   if (cp == MAP_FAILED) return 0;
 
@@ -3650,8 +3672,8 @@ public_mALLOc(size_t bytes)
       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
       (void)mutex_unlock(&main_arena.mutex);
       if(ar_ptr) {
-        victim = _int_malloc(ar_ptr, bytes);
-        (void)mutex_unlock(&ar_ptr->mutex);
+	victim = _int_malloc(ar_ptr, bytes);
+	(void)mutex_unlock(&ar_ptr->mutex);
       }
 #endif
     }
@@ -3689,7 +3711,7 @@ public_fREe(Void_t* mem)
     /* see if the dynamic brk/mmap threshold needs adjusting */
     if (!mp_.no_dyn_threshold
 	&& p->size > mp_.mmap_threshold
-        && p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
+	&& p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
       {
 	mp_.mmap_threshold = chunksize (p);
 	mp_.trim_threshold = 2 * mp_.mmap_threshold;
@@ -3871,8 +3893,8 @@ public_mEMALIGn(size_t alignment, size_t bytes)
       (void)mutex_unlock(&ar_ptr->mutex);
       ar_ptr = arena_get2(prev, bytes);
       if(ar_ptr) {
-        p = _int_memalign(ar_ptr, alignment, bytes);
-        (void)mutex_unlock(&ar_ptr->mutex);
+	p = _int_memalign(ar_ptr, alignment, bytes);
+	(void)mutex_unlock(&ar_ptr->mutex);
       }
 #endif
     }
@@ -3919,8 +3941,8 @@ public_vALLOc(size_t bytes)
       /* ... or sbrk() has failed and there is still a chance to mmap() */
       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
       if(ar_ptr) {
-        p = _int_memalign(ar_ptr, pagesz, bytes);
-        (void)mutex_unlock(&ar_ptr->mutex);
+	p = _int_memalign(ar_ptr, pagesz, bytes);
+	(void)mutex_unlock(&ar_ptr->mutex);
       }
 #endif
     }
@@ -3965,8 +3987,8 @@ public_pVALLOc(size_t bytes)
       ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0,
 			  bytes + 2*pagesz + MINSIZE);
       if(ar_ptr) {
-        p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
-        (void)mutex_unlock(&ar_ptr->mutex);
+	p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
+	(void)mutex_unlock(&ar_ptr->mutex);
       }
 #endif
     }
@@ -4059,8 +4081,8 @@ public_cALLOc(size_t n, size_t elem_size)
       av = arena_get2(av->next ? av : 0, sz);
       (void)mutex_unlock(&main_arena.mutex);
       if(av) {
-        mem = _int_malloc(av, sz);
-        (void)mutex_unlock(&av->mutex);
+	mem = _int_malloc(av, sz);
+	(void)mutex_unlock(&av->mutex);
       }
 #endif
     }
@@ -4308,21 +4330,21 @@ _int_malloc(mstate av, size_t bytes)
 
     if ( (victim = last(bin)) != bin) {
       if (victim == 0) /* initialization check */
-        malloc_consolidate(av);
+	malloc_consolidate(av);
       else {
-        bck = victim->bk;
+	bck = victim->bk;
 	if (__builtin_expect (bck->fd != victim, 0))
 	  {
 	    errstr = "malloc(): smallbin double linked list corrupted";
 	    goto errout;
 	  }
-        set_inuse_bit_at_offset(victim, nb);
-        bin->bk = bck;
-        bck->fd = bin;
+	set_inuse_bit_at_offset(victim, nb);
+	bin->bk = bck;
+	bck->fd = bin;
 
-        if (av != &main_arena)
+	if (av != &main_arena)
 	  victim->size |= NON_MAIN_ARENA;
-        check_malloced_chunk(av, victim, nb);
+	check_malloced_chunk(av, victim, nb);
 	void *p = chunk2mem(victim);
 	if (__builtin_expect (perturb_byte, 0))
 	  alloc_perturb (p, bytes);
@@ -4373,36 +4395,36 @@ _int_malloc(mstate av, size_t bytes)
       size = chunksize(victim);
 
       /*
-         If a small request, try to use last remainder if it is the
-         only chunk in unsorted bin.  This helps promote locality for
-         runs of consecutive small requests. This is the only
-         exception to best-fit, and applies only when there is
-         no exact fit for a small chunk.
+	 If a small request, try to use last remainder if it is the
+	 only chunk in unsorted bin.  This helps promote locality for
+	 runs of consecutive small requests. This is the only
+	 exception to best-fit, and applies only when there is
+	 no exact fit for a small chunk.
       */
 
       if (in_smallbin_range(nb) &&
-          bck == unsorted_chunks(av) &&
-          victim == av->last_remainder &&
-          (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
-
-        /* split and reattach remainder */
-        remainder_size = size - nb;
-        remainder = chunk_at_offset(victim, nb);
-        unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
-        av->last_remainder = remainder;
-        remainder->bk = remainder->fd = unsorted_chunks(av);
+	  bck == unsorted_chunks(av) &&
+	  victim == av->last_remainder &&
+	  (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
+
+	/* split and reattach remainder */
+	remainder_size = size - nb;
+	remainder = chunk_at_offset(victim, nb);
+	unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
+	av->last_remainder = remainder;
+	remainder->bk = remainder->fd = unsorted_chunks(av);
 	if (!in_smallbin_range(remainder_size))
 	  {
 	    remainder->fd_nextsize = NULL;
 	    remainder->bk_nextsize = NULL;
 	  }
 
-        set_head(victim, nb | PREV_INUSE |
+	set_head(victim, nb | PREV_INUSE |
 		 (av != &main_arena ? NON_MAIN_ARENA : 0));
-        set_head(remainder, remainder_size | PREV_INUSE);
-        set_foot(remainder, remainder_size);
+	set_head(remainder, remainder_size | PREV_INUSE);
+	set_foot(remainder, remainder_size);
 
-        check_malloced_chunk(av, victim, nb);
+	check_malloced_chunk(av, victim, nb);
 	void *p = chunk2mem(victim);
 	if (__builtin_expect (perturb_byte, 0))
 	  alloc_perturb (p, bytes);
@@ -4416,10 +4438,10 @@ _int_malloc(mstate av, size_t bytes)
       /* Take now instead of binning if exact fit */
 
       if (size == nb) {
-        set_inuse_bit_at_offset(victim, size);
+	set_inuse_bit_at_offset(victim, size);
 	if (av != &main_arena)
 	  victim->size |= NON_MAIN_ARENA;
-        check_malloced_chunk(av, victim, nb);
+	check_malloced_chunk(av, victim, nb);
 	void *p = chunk2mem(victim);
 	if (__builtin_expect (perturb_byte, 0))
 	  alloc_perturb (p, bytes);
@@ -4429,30 +4451,30 @@ _int_malloc(mstate av, size_t bytes)
       /* place chunk in bin */
 
       if (in_smallbin_range(size)) {
-        victim_index = smallbin_index(size);
-        bck = bin_at(av, victim_index);
-        fwd = bck->fd;
+	victim_index = smallbin_index(size);
+	bck = bin_at(av, victim_index);
+	fwd = bck->fd;
       }
       else {
-        victim_index = largebin_index(size);
-        bck = bin_at(av, victim_index);
-        fwd = bck->fd;
+	victim_index = largebin_index(size);
+	bck = bin_at(av, victim_index);
+	fwd = bck->fd;
 
-        /* maintain large bins in sorted order */
-        if (fwd != bck) {
+	/* maintain large bins in sorted order */
+	if (fwd != bck) {
 	  /* Or with inuse bit to speed comparisons */
-          size |= PREV_INUSE;
-          /* if smaller than smallest, bypass loop below */
+	  size |= PREV_INUSE;
+	  /* if smaller than smallest, bypass loop below */
 	  assert((bck->bk->size & NON_MAIN_ARENA) == 0);
 	  if ((unsigned long)(size) < (unsigned long)(bck->bk->size)) {
-            fwd = bck;
-            bck = bck->bk;
+	    fwd = bck;
+	    bck = bck->bk;
 
 	    victim->fd_nextsize = fwd->fd;
 	    victim->bk_nextsize = fwd->fd->bk_nextsize;
 	    fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
-          }
-          else {
+	  }
+	  else {
 	    assert((fwd->size & NON_MAIN_ARENA) == 0);
 	    while ((unsigned long) size < fwd->size)
 	      {
@@ -4471,7 +4493,7 @@ _int_malloc(mstate av, size_t bytes)
 		victim->bk_nextsize->fd_nextsize = victim;
 	      }
 	    bck = fwd->bk;
-          }
+	  }
 	} else
 	  victim->fd_nextsize = victim->bk_nextsize = victim;
       }
@@ -4497,32 +4519,32 @@ _int_malloc(mstate av, size_t bytes)
 
       /* skip scan if empty or largest chunk is too small */
       if ((victim = first(bin)) != bin &&
-          (unsigned long)(victim->size) >= (unsigned long)(nb)) {
+	  (unsigned long)(victim->size) >= (unsigned long)(nb)) {
 
 	victim = victim->bk_nextsize;
-        while (((unsigned long)(size = chunksize(victim)) <
-                (unsigned long)(nb)))
-          victim = victim->bk_nextsize;
+	while (((unsigned long)(size = chunksize(victim)) <
+		(unsigned long)(nb)))
+	  victim = victim->bk_nextsize;
 
 	/* Avoid removing the first entry for a size so that the skip
 	   list does not have to be rerouted.  */
 	if (victim != last(bin) && victim->size == victim->fd->size)
 	  victim = victim->fd;
 
-        remainder_size = size - nb;
-        unlink(victim, bck, fwd);
+	remainder_size = size - nb;
+	unlink(victim, bck, fwd);
 
-        /* Exhaust */
-        if (remainder_size < MINSIZE)  {
-          set_inuse_bit_at_offset(victim, size);
+	/* Exhaust */
+	if (remainder_size < MINSIZE)  {
+	  set_inuse_bit_at_offset(victim, size);
 	  if (av != &main_arena)
 	    victim->size |= NON_MAIN_ARENA;
-        }
-        /* Split */
-        else {
-          remainder = chunk_at_offset(victim, nb);
-          /* We cannot assume the unsorted list is empty and therefore
-             have to perform a complete insert here.  */
+	}
+	/* Split */
+	else {
+	  remainder = chunk_at_offset(victim, nb);
+	  /* We cannot assume the unsorted list is empty and therefore
+	     have to perform a complete insert here.  */
 	  bck = unsorted_chunks(av);
 	  fwd = bck->fd;
 	  if (__builtin_expect (fwd->bk != bck, 0))
@@ -4539,11 +4561,11 @@ _int_malloc(mstate av, size_t bytes)
 	      remainder->fd_nextsize = NULL;
 	      remainder->bk_nextsize = NULL;
 	    }
-          set_head(victim, nb | PREV_INUSE |
+	  set_head(victim, nb | PREV_INUSE |
 		   (av != &main_arena ? NON_MAIN_ARENA : 0));
-          set_head(remainder, remainder_size | PREV_INUSE);
-          set_foot(remainder, remainder_size);
-        }
+	  set_head(remainder, remainder_size | PREV_INUSE);
+	  set_foot(remainder, remainder_size);
+	}
 	check_malloced_chunk(av, victim, nb);
 	void *p = chunk2mem(victim);
 	if (__builtin_expect (perturb_byte, 0))
@@ -4573,20 +4595,20 @@ _int_malloc(mstate av, size_t bytes)
 
       /* Skip rest of block if there are no more set bits in this block.  */
       if (bit > map || bit == 0) {
-        do {
-          if (++block >= BINMAPSIZE)  /* out of bins */
-            goto use_top;
-        } while ( (map = av->binmap[block]) == 0);
+	do {
+	  if (++block >= BINMAPSIZE)  /* out of bins */
+	    goto use_top;
+	} while ( (map = av->binmap[block]) == 0);
 
-        bin = bin_at(av, (block << BINMAPSHIFT));
-        bit = 1;
+	bin = bin_at(av, (block << BINMAPSHIFT));
+	bit = 1;
       }
 
       /* Advance to bin with set bit. There must be one. */
       while ((bit & map) == 0) {
-        bin = next_bin(bin);
-        bit <<= 1;
-        assert(bit != 0);
+	bin = next_bin(bin);
+	bit <<= 1;
+	assert(bit != 0);
       }
 
       /* Inspect the bin. It is likely to be non-empty */
@@ -4594,32 +4616,32 @@ _int_malloc(mstate av, size_t bytes)
 
       /*  If a false alarm (empty bin), clear the bit. */
       if (victim == bin) {
-        av->binmap[block] = map &= ~bit; /* Write through */
-        bin = next_bin(bin);
-        bit <<= 1;
+	av->binmap[block] = map &= ~bit; /* Write through */
+	bin = next_bin(bin);
+	bit <<= 1;
       }
 
       else {
-        size = chunksize(victim);
+	size = chunksize(victim);
 
-        /*  We know the first chunk in this bin is big enough to use. */
-        assert((unsigned long)(size) >= (unsigned long)(nb));
+	/*  We know the first chunk in this bin is big enough to use. */
+	assert((unsigned long)(size) >= (unsigned long)(nb));
 
-        remainder_size = size - nb;
+	remainder_size = size - nb;
 
-        /* unlink */
-        unlink(victim, bck, fwd);
+	/* unlink */
+	unlink(victim, bck, fwd);
 
-        /* Exhaust */
-        if (remainder_size < MINSIZE) {
-          set_inuse_bit_at_offset(victim, size);
+	/* Exhaust */
+	if (remainder_size < MINSIZE) {
+	  set_inuse_bit_at_offset(victim, size);
 	  if (av != &main_arena)
 	    victim->size |= NON_MAIN_ARENA;
-        }
+	}
 
-        /* Split */
-        else {
-          remainder = chunk_at_offset(victim, nb);
+	/* Split */
+	else {
+	  remainder = chunk_at_offset(victim, nb);
 
 	  /* We cannot assume the unsorted list is empty and therefore
 	     have to perform a complete insert here.  */
@@ -4635,19 +4657,19 @@ _int_malloc(mstate av, size_t bytes)
 	  bck->fd = remainder;
 	  fwd->bk = remainder;
 
-          /* advertise as last remainder */
-          if (in_smallbin_range(nb))
-            av->last_remainder = remainder;
+	  /* advertise as last remainder */
+	  if (in_smallbin_range(nb))
+	    av->last_remainder = remainder;
 	  if (!in_smallbin_range(remainder_size))
 	    {
 	      remainder->fd_nextsize = NULL;
 	      remainder->bk_nextsize = NULL;
 	    }
-          set_head(victim, nb | PREV_INUSE |
+	  set_head(victim, nb | PREV_INUSE |
 		   (av != &main_arena ? NON_MAIN_ARENA : 0));
-          set_head(remainder, remainder_size | PREV_INUSE);
-          set_foot(remainder, remainder_size);
-        }
+	  set_head(remainder, remainder_size | PREV_INUSE);
+	  set_foot(remainder, remainder_size);
+	}
 	check_malloced_chunk(av, victim, nb);
 	void *p = chunk2mem(victim);
 	if (__builtin_expect (perturb_byte, 0))
@@ -5104,53 +5126,53 @@ static void malloc_consolidate(av) mstate av;
 #ifndef ATOMIC_FASTBINS
 	*fb = 0;
 #endif
-        do {
-          check_inuse_chunk(av, p);
-          nextp = p->fd;
-
-          /* Slightly streamlined version of consolidation code in free() */
-          size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
-          nextchunk = chunk_at_offset(p, size);
-          nextsize = chunksize(nextchunk);
-
-          if (!prev_inuse(p)) {
-            prevsize = p->prev_size;
-            size += prevsize;
-            p = chunk_at_offset(p, -((long) prevsize));
-            unlink(p, bck, fwd);
-          }
-
-          if (nextchunk != av->top) {
-            nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
-
-            if (!nextinuse) {
-              size += nextsize;
-              unlink(nextchunk, bck, fwd);
-            } else
+	do {
+	  check_inuse_chunk(av, p);
+	  nextp = p->fd;
+
+	  /* Slightly streamlined version of consolidation code in free() */
+	  size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
+	  nextchunk = chunk_at_offset(p, size);
+	  nextsize = chunksize(nextchunk);
+
+	  if (!prev_inuse(p)) {
+	    prevsize = p->prev_size;
+	    size += prevsize;
+	    p = chunk_at_offset(p, -((long) prevsize));
+	    unlink(p, bck, fwd);
+	  }
+
+	  if (nextchunk != av->top) {
+	    nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
+
+	    if (!nextinuse) {
+	      size += nextsize;
+	      unlink(nextchunk, bck, fwd);
+	    } else
 	      clear_inuse_bit_at_offset(nextchunk, 0);
 
-            first_unsorted = unsorted_bin->fd;
-            unsorted_bin->fd = p;
-            first_unsorted->bk = p;
+	    first_unsorted = unsorted_bin->fd;
+	    unsorted_bin->fd = p;
+	    first_unsorted->bk = p;
 
-            if (!in_smallbin_range (size)) {
+	    if (!in_smallbin_range (size)) {
 	      p->fd_nextsize = NULL;
 	      p->bk_nextsize = NULL;
 	    }
 
-            set_head(p, size | PREV_INUSE);
-            p->bk = unsorted_bin;
-            p->fd = first_unsorted;
-            set_foot(p, size);
-          }
+	    set_head(p, size | PREV_INUSE);
+	    p->bk = unsorted_bin;
+	    p->fd = first_unsorted;
+	    set_foot(p, size);
+	  }
 
-          else {
-            size += nextsize;
-            set_head(p, size | PREV_INUSE);
-            av->top = p;
-          }
+	  else {
+	    size += nextsize;
+	    set_head(p, size | PREV_INUSE);
+	    av->top = p;
+	  }
 
-        } while ( (p = nextp) != 0);
+	} while ( (p = nextp) != 0);
 
       }
     } while (fb++ != maxfb);
@@ -5226,82 +5248,82 @@ _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
     else {
       /* Try to expand forward into top */
       if (next == av->top &&
-          (unsigned long)(newsize = oldsize + nextsize) >=
-          (unsigned long)(nb + MINSIZE)) {
-        set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
-        av->top = chunk_at_offset(oldp, nb);
-        set_head(av->top, (newsize - nb) | PREV_INUSE);
+	  (unsigned long)(newsize = oldsize + nextsize) >=
+	  (unsigned long)(nb + MINSIZE)) {
+	set_head_size(oldp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
+	av->top = chunk_at_offset(oldp, nb);
+	set_head(av->top, (newsize - nb) | PREV_INUSE);
 	check_inuse_chunk(av, oldp);
-        return chunk2mem(oldp);
+	return chunk2mem(oldp);
       }
 
       /* Try to expand forward into next chunk;  split off remainder below */
       else if (next != av->top &&
-               !inuse(next) &&
-               (unsigned long)(newsize = oldsize + nextsize) >=
-               (unsigned long)(nb)) {
-        newp = oldp;
-        unlink(next, bck, fwd);
+	       !inuse(next) &&
+	       (unsigned long)(newsize = oldsize + nextsize) >=
+	       (unsigned long)(nb)) {
+	newp = oldp;
+	unlink(next, bck, fwd);
       }
 
       /* allocate, copy, free */
       else {
-        newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
-        if (newmem == 0)
-          return 0; /* propagate failure */
-
-        newp = mem2chunk(newmem);
-        newsize = chunksize(newp);
-
-        /*
-          Avoid copy if newp is next chunk after oldp.
-        */
-        if (newp == next) {
-          newsize += oldsize;
-          newp = oldp;
-        }
-        else {
-          /*
-            Unroll copy of <= 36 bytes (72 if 8byte sizes)
-            We know that contents have an odd number of
-            INTERNAL_SIZE_T-sized words; minimally 3.
-          */
-
-          copysize = oldsize - SIZE_SZ;
-          s = (INTERNAL_SIZE_T*)(chunk2mem(oldp));
-          d = (INTERNAL_SIZE_T*)(newmem);
-          ncopies = copysize / sizeof(INTERNAL_SIZE_T);
-          assert(ncopies >= 3);
-
-          if (ncopies > 9)
-            MALLOC_COPY(d, s, copysize);
-
-          else {
-            *(d+0) = *(s+0);
-            *(d+1) = *(s+1);
-            *(d+2) = *(s+2);
-            if (ncopies > 4) {
-              *(d+3) = *(s+3);
-              *(d+4) = *(s+4);
-              if (ncopies > 6) {
-                *(d+5) = *(s+5);
-                *(d+6) = *(s+6);
-                if (ncopies > 8) {
-                  *(d+7) = *(s+7);
-                  *(d+8) = *(s+8);
-                }
-              }
-            }
-          }
+	newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
+	if (newmem == 0)
+	  return 0; /* propagate failure */
+
+	newp = mem2chunk(newmem);
+	newsize = chunksize(newp);
+
+	/*
+	  Avoid copy if newp is next chunk after oldp.
+	*/
+	if (newp == next) {
+	  newsize += oldsize;
+	  newp = oldp;
+	}
+	else {
+	  /*
+	    Unroll copy of <= 36 bytes (72 if 8byte sizes)
+	    We know that contents have an odd number of
+	    INTERNAL_SIZE_T-sized words; minimally 3.
+	  */
+
+	  copysize = oldsize - SIZE_SZ;
+	  s = (INTERNAL_SIZE_T*)(chunk2mem(oldp));
+	  d = (INTERNAL_SIZE_T*)(newmem);
+	  ncopies = copysize / sizeof(INTERNAL_SIZE_T);
+	  assert(ncopies >= 3);
+
+	  if (ncopies > 9)
+	    MALLOC_COPY(d, s, copysize);
+
+	  else {
+	    *(d+0) = *(s+0);
+	    *(d+1) = *(s+1);
+	    *(d+2) = *(s+2);
+	    if (ncopies > 4) {
+	      *(d+3) = *(s+3);
+	      *(d+4) = *(s+4);
+	      if (ncopies > 6) {
+		*(d+5) = *(s+5);
+		*(d+6) = *(s+6);
+		if (ncopies > 8) {
+		  *(d+7) = *(s+7);
+		  *(d+8) = *(s+8);
+		}
+	      }
+	    }
+	  }
 
 #ifdef ATOMIC_FASTBINS
-          _int_free(av, oldp, 1);
+	  _int_free(av, oldp, 1);
 #else
-          _int_free(av, oldp);
+	  _int_free(av, oldp);
 #endif
-          check_inuse_chunk(av, newp);
-          return chunk2mem(newp);
-        }
+	  check_inuse_chunk(av, newp);
+	  return chunk2mem(newp);
+	}
       }
     }
 
@@ -5367,11 +5389,11 @@ _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
       /* update statistics */
       sum = mp_.mmapped_mem += newsize - oldsize;
       if (sum > (unsigned long)(mp_.max_mmapped_mem))
-        mp_.max_mmapped_mem = sum;
+	mp_.max_mmapped_mem = sum;
 #ifdef NO_THREADS
       sum += main_arena.system_mem;
       if (sum > (unsigned long)(mp_.max_total_mem))
-        mp_.max_total_mem = sum;
+	mp_.max_total_mem = sum;
 #endif
 
       return chunk2mem(newp);
@@ -5385,11 +5407,11 @@ _int_realloc(mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
       /* Must alloc, copy, free. */
       newmem = _int_malloc(av, nb - MALLOC_ALIGN_MASK);
       if (newmem != 0) {
-        MALLOC_COPY(newmem, chunk2mem(oldp), oldsize - 2*SIZE_SZ);
+	MALLOC_COPY(newmem, chunk2mem(oldp), oldsize - 2*SIZE_SZ);
 #ifdef ATOMIC_FASTBINS
-        _int_free(av, oldp, 1);
+	_int_free(av, oldp, 1);
 #else
-        _int_free(av, oldp);
+	_int_free(av, oldp);
 #endif
       }
     }
@@ -5465,7 +5487,7 @@ _int_memalign(mstate av, size_t alignment, size_t bytes)
     */
 
     brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
-                           -((signed long) alignment));
+			   -((signed long) alignment));
     if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
       brk += alignment;
 
@@ -5493,7 +5515,7 @@ _int_memalign(mstate av, size_t alignment, size_t bytes)
     p = newp;
 
     assert (newsize >= nb &&
-            (((unsigned long)(chunk2mem(p))) % alignment) == 0);
+	    (((unsigned long)(chunk2mem(p))) % alignment) == 0);
   }
 
   /* Also give back spare room at the end */
@@ -5543,9 +5565,9 @@ Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
 #endif
     {
       /*
-        Unroll clear of <= 36 bytes (72 if 8byte sizes)
-        We know that contents have an odd number of
-        INTERNAL_SIZE_T-sized words; minimally 3.
+	Unroll clear of <= 36 bytes (72 if 8byte sizes)
+	We know that contents have an odd number of
+	INTERNAL_SIZE_T-sized words; minimally 3.
       */
 
       d = (INTERNAL_SIZE_T*)mem;
@@ -5554,24 +5576,24 @@ Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
       assert(nclears >= 3);
 
       if (nclears > 9)
-        MALLOC_ZERO(d, clearsize);
+	MALLOC_ZERO(d, clearsize);
 
       else {
-        *(d+0) = 0;
-        *(d+1) = 0;
-        *(d+2) = 0;
-        if (nclears > 4) {
-          *(d+3) = 0;
-          *(d+4) = 0;
-          if (nclears > 6) {
-            *(d+5) = 0;
-            *(d+6) = 0;
-            if (nclears > 8) {
-              *(d+7) = 0;
-              *(d+8) = 0;
-            }
-          }
-        }
+	*(d+0) = 0;
+	*(d+1) = 0;
+	*(d+2) = 0;
+	if (nclears > 4) {
+	  *(d+3) = 0;
+	  *(d+4) = 0;
+	  if (nclears > 6) {
+	    *(d+5) = 0;
+	    *(d+6) = 0;
+	    if (nclears > 8) {
+	      *(d+7) = 0;
+	      *(d+8) = 0;
+	    }
+	  }
+	}
       }
     }
   }
@@ -5714,9 +5736,9 @@ mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
     marray[i] = chunk2mem(p);
     if (i != n_elements-1) {
       if (element_size != 0)
-        size = element_size;
+	size = element_size;
       else
-        size = request2size(sizes[i]);
+	size = request2size(sizes[i]);
       remainder_size -= size;
       set_head(p, size | size_flags);
       p = chunk_at_offset(p, size);
@@ -5804,9 +5826,9 @@ static int mTRIm(av, pad) mstate av; size_t pad;
   for (int i = 1; i < NBINS; ++i)
     if (i == 1 || i >= psindex)
       {
-        mbinptr bin = bin_at (av, i);
+	mbinptr bin = bin_at (av, i);
 
-        for (mchunkptr p = last (bin); p != bin; p = p->bk)
+	for (mchunkptr p = last (bin); p != bin; p = p->bk)
 	  {
 	    INTERNAL_SIZE_T size = chunksize (p);
 
@@ -5989,7 +6011,7 @@ void mSTATs()
   fprintf(stderr, "locked in loop   = %10ld\n", stat_lock_loop);
   fprintf(stderr, "locked waiting   = %10ld\n", stat_lock_wait);
   fprintf(stderr, "locked total     = %10ld\n",
-          stat_lock_direct + stat_lock_loop + stat_lock_wait);
+	  stat_lock_direct + stat_lock_loop + stat_lock_wait);
 #endif
 #ifdef _LIBC
   ((_IO_FILE *) stderr)->_flags2 |= old_flags2;
@@ -6178,12 +6200,12 @@ int mALLOPt(param_number, value) int param_number; int value;
     if (size > 0)
     {
       if (size < MINIMUM_MORECORE_SIZE)
-         size = MINIMUM_MORECORE_SIZE;
+	 size = MINIMUM_MORECORE_SIZE;
       if (CurrentExecutionLevel() == kTaskLevel)
-         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
+	 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
       if (ptr == 0)
       {
-        return (void *) MORECORE_FAILURE;
+	return (void *) MORECORE_FAILURE;
       }
       // save ptrs so they can be freed during cleanup
       our_os_pools[next_os_pool] = ptr;
@@ -6213,8 +6235,8 @@ int mALLOPt(param_number, value) int param_number; int value;
     for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
       if (*ptr)
       {
-         PoolDeallocate(*ptr);
-         *ptr = 0;
+	 PoolDeallocate(*ptr);
+	 *ptr = 0;
       }
   }
 
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 2f878d10fb..42f1b67992 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2009-08-27  Andrew Stubbs  <ams@codesourcery.com>
+
+	* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
+	Correct a logic error.
+
 2009-08-25  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/x86_64/tls.h (RTLD_ENABLE_FOREIGN_CALL): Store old value
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index b80c369a3c..49b4e6d6e0 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -52,7 +52,7 @@
 #  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, reg	; \
-	add	reg, tmp 	; \
+	add	reg, tmp	; \
 	bra	98f		; \
 	 mov.l	@tmp, reg	; \
 99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
@@ -61,7 +61,7 @@
 #  define LOAD_PRIVATE_FUTEX_WAIT(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, reg	; \
-	add	reg, tmp 	; \
+	add	reg, tmp	; \
 	mov.l	@tmp, reg	; \
 	bra	98f		; \
 	 mov	#FUTEX_WAIT, tmp ; \
@@ -71,7 +71,7 @@
 # define LOAD_PRIVATE_FUTEX_WAKE(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, reg	; \
-	add	reg, tmp 	; \
+	add	reg, tmp	; \
 	mov.l	@tmp, reg	; \
 	bra	98f		; \
 	 mov	#FUTEX_WAKE, tmp ; \
@@ -81,7 +81,7 @@
 #  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
+	add	tmp2, tmp	; \
 	mov.l	@tmp, tmp2	; \
 	bra	98f		; \
 	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
@@ -93,7 +93,7 @@
 #  define LOAD_FUTEX_WAIT(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
+	add	tmp2, tmp	; \
 	mov.l	@tmp, tmp2	; \
 	bra	98f		; \
 	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
@@ -107,7 +107,7 @@
 # define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
+	add	tmp2, tmp	; \
 	mov.l	@tmp, tmp2	; \
 	bra	98f		; \
 	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
@@ -123,7 +123,7 @@
 # define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
 	mov.w	99f, tmp2	; \
-	add	tmp2, tmp 	; \
+	add	tmp2, tmp	; \
 	mov.l	@tmp, tmp2	; \
 	bra	98f		; \
 	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
@@ -253,7 +253,7 @@ __lll_timedlock_wait:
 	mov	#2, r6
 	cmp/eq	r6, r2
 	bf/s	2f
-	 mov	r2, r6
+	 mov	r6, r2
 
 1:
 	mov	#2, r6
@@ -327,7 +327,7 @@ __lll_timedlock_wait:
 
 	tst	r3, r3
 	bt	6f
-	
+
 1:
 	/* Get current time.  */
 	mov	r15, r4
diff --git a/stdlib/tst-strtol.c b/stdlib/tst-strtol.c
index db065d6f0a..28878546f1 100644
--- a/stdlib/tst-strtol.c
+++ b/stdlib/tst-strtol.c
@@ -64,6 +64,148 @@ static const struct ltest tests[] =
   {"-2147483648", 0x80000000, 0, 0, 0},
   {"-2147483649", 0x80000000, 0, 0, ERANGE},
   {"0x1122334455z", 2147483647, 16, 'z', ERANGE},
+
+  {"1111111111111111111111111111111", 2147483647, 2, 0, 0},
+  {"10000000000000000000000000000000", 2147483647, 2, 0, ERANGE},
+  {"12112122212110202101", 2147483647, 3, 0, 0},
+  {"12112122212110202102", 2147483647, 3, 0, ERANGE},
+  {"1333333333333333", 2147483647, 4, 0, 0},
+  {"2000000000000000", 2147483647, 4, 0, ERANGE},
+  {"13344223434042", 2147483647, 5, 0, 0},
+  {"13344223434043", 2147483647, 5, 0, ERANGE},
+  {"553032005531", 2147483647, 6, 0, 0},
+  {"553032005532", 2147483647, 6, 0, ERANGE},
+  {"104134211161", 2147483647, 7, 0, 0},
+  {"104134211162", 2147483647, 7, 0, ERANGE},
+  {"17777777777", 2147483647, 8, 0, 0},
+  {"20000000000", 2147483647, 8, 0, ERANGE},
+  {"5478773671", 2147483647, 9, 0, 0},
+  {"5478773672", 2147483647, 9, 0, ERANGE},
+  {"2147483647", 2147483647, 10, 0, 0},
+  {"2147483648", 2147483647, 10, 0, ERANGE},
+  {"a02220281", 2147483647, 11, 0, 0},
+  {"a02220282", 2147483647, 11, 0, ERANGE},
+  {"4bb2308a7", 2147483647, 12, 0, 0},
+  {"4bb2308a8", 2147483647, 12, 0, ERANGE},
+  {"282ba4aaa", 2147483647, 13, 0, 0},
+  {"282ba4aab", 2147483647, 13, 0, ERANGE},
+  {"1652ca931", 2147483647, 14, 0, 0},
+  {"1652ca932", 2147483647, 14, 0, ERANGE},
+  {"c87e66b7", 2147483647, 15, 0, 0},
+  {"c87e66b8", 2147483647, 15, 0, ERANGE},
+  {"7fffffff", 2147483647, 16, 0, 0},
+  {"80000000", 2147483647, 16, 0, ERANGE},
+  {"53g7f548", 2147483647, 17, 0, 0},
+  {"53g7f549", 2147483647, 17, 0, ERANGE},
+  {"3928g3h1", 2147483647, 18, 0, 0},
+  {"3928g3h2", 2147483647, 18, 0, ERANGE},
+  {"27c57h32", 2147483647, 19, 0, 0},
+  {"27c57h33", 2147483647, 19, 0, ERANGE},
+  {"1db1f927", 2147483647, 20, 0, 0},
+  {"1db1f928", 2147483647, 20, 0, ERANGE},
+  {"140h2d91", 2147483647, 21, 0, 0},
+  {"140h2d92", 2147483647, 21, 0, ERANGE},
+  {"ikf5bf1", 2147483647, 22, 0, 0},
+  {"ikf5bf2", 2147483647, 22, 0, ERANGE},
+  {"ebelf95", 2147483647, 23, 0, 0},
+  {"ebelf96", 2147483647, 23, 0, ERANGE},
+  {"b5gge57", 2147483647, 24, 0, 0},
+  {"b5gge58", 2147483647, 24, 0, ERANGE},
+  {"8jmdnkm", 2147483647, 25, 0, 0},
+  {"8jmdnkn", 2147483647, 25, 0, ERANGE},
+  {"6oj8ion", 2147483647, 26, 0, 0},
+  {"6oj8ioo", 2147483647, 26, 0, ERANGE},
+  {"5ehncka", 2147483647, 27, 0, 0},
+  {"5ehnckb", 2147483647, 27, 0, ERANGE},
+  {"4clm98f", 2147483647, 28, 0, 0},
+  {"4clm98g", 2147483647, 28, 0, ERANGE},
+  {"3hk7987", 2147483647, 29, 0, 0},
+  {"3hk7988", 2147483647, 29, 0, ERANGE},
+  {"2sb6cs7", 2147483647, 30, 0, 0},
+  {"2sb6cs8", 2147483647, 30, 0, ERANGE},
+  {"2d09uc1", 2147483647, 31, 0, 0},
+  {"2d09uc2", 2147483647, 31, 0, ERANGE},
+  {"1vvvvvv", 2147483647, 32, 0, 0},
+  {"2000000", 2147483647, 32, 0, ERANGE},
+  {"1lsqtl1", 2147483647, 33, 0, 0},
+  {"1lsqtl2", 2147483647, 33, 0, ERANGE},
+  {"1d8xqrp", 2147483647, 34, 0, 0},
+  {"1d8xqrq", 2147483647, 34, 0, ERANGE},
+  {"15v22um", 2147483647, 35, 0, 0},
+  {"15v22un", 2147483647, 35, 0, ERANGE},
+  {"zik0zj", 2147483647, 36, 0, 0},
+  {"zik0zk", 2147483647, 36, 0, ERANGE},
+
+  {"-10000000000000000000000000000000", -2147483648, 2, 0, 0},
+  {"-10000000000000000000000000000001", -2147483648, 2, 0, ERANGE},
+  {"-12112122212110202102", -2147483648, 3, 0, 0},
+  {"-12112122212110202110", -2147483648, 3, 0, ERANGE},
+  {"-2000000000000000", -2147483648, 4, 0, 0},
+  {"-2000000000000001", -2147483648, 4, 0, ERANGE},
+  {"-13344223434043", -2147483648, 5, 0, 0},
+  {"-13344223434044", -2147483648, 5, 0, ERANGE},
+  {"-553032005532", -2147483648, 6, 0, 0},
+  {"-553032005533", -2147483648, 6, 0, ERANGE},
+  {"-104134211162", -2147483648, 7, 0, 0},
+  {"-104134211163", -2147483648, 7, 0, ERANGE},
+  {"-20000000000", -2147483648, 8, 0, },
+  {"-20000000001", -2147483648, 8, 0, ERANGE},
+  {"-5478773672", -2147483648, 9, 0, 0},
+  {"-5478773673", -2147483648, 9, 0, ERANGE},
+  {"-2147483648", -2147483648, 10, 0, 0},
+  {"-2147483649", -2147483648, 10, 0, ERANGE},
+  {"-a02220282", -2147483648, 11, 0, 0},
+  {"-a02220283", -2147483648, 11, 0, ERANGE},
+  {"-4bb2308a8", -2147483648, 12, 0, 0},
+  {"-4bb2308a9", -2147483648, 12, 0, ERANGE},
+  {"-282ba4aab", -2147483648, 13, 0, 0},
+  {"-282ba4aac", -2147483648, 13, 0, ERANGE},
+  {"-1652ca932", -2147483648, 14, 0, 0},
+  {"-1652ca933", -2147483648, 14, 0, ERANGE},
+  {"-c87e66b8", -2147483648, 15, 0, 0},
+  {"-c87e66b9", -2147483648, 15, 0, ERANGE},
+  {"-80000000", -2147483648, 16, 0, 0},
+  {"-80000001", -2147483648, 16, 0, ERANGE},
+  {"-53g7f549", -2147483648, 17, 0, 0},
+  {"-53g7f54a", -2147483648, 17, 0, ERANGE},
+  {"-3928g3h2", -2147483648, 18, 0, 0},
+  {"-3928g3h3", -2147483648, 18, 0, ERANGE},
+  {"-27c57h33", -2147483648, 19, 0, 0},
+  {"-27c57h34", -2147483648, 19, 0, ERANGE},
+  {"-1db1f928", -2147483648, 20, 0, 0},
+  {"-1db1f929", -2147483648, 20, 0, ERANGE},
+  {"-140h2d92", -2147483648, 21, 0, 0},
+  {"-140h2d93", -2147483648, 21, 0, ERANGE},
+  {"-ikf5bf2", -2147483648, 22, 0, 0},
+  {"-ikf5bf3", -2147483648, 22, 0, ERANGE},
+  {"-ebelf96", -2147483648, 23, 0, 0},
+  {"-ebelf97", -2147483648, 23, 0, ERANGE},
+  {"-b5gge58", -2147483648, 24, 0, 0},
+  {"-b5gge59", -2147483648, 24, 0, ERANGE},
+  {"-8jmdnkn", -2147483648, 25, 0, 0},
+  {"-8jmdnko", -2147483648, 25, 0, ERANGE},
+  {"-6oj8ioo", -2147483648, 26, 0, 0},
+  {"-6oj8iop", -2147483648, 26, 0, ERANGE},
+  {"-5ehnckb", -2147483648, 27, 0, 0},
+  {"-5ehnckc", -2147483648, 27, 0, ERANGE},
+  {"-4clm98g", -2147483648, 28, 0, 0},
+  {"-4clm98h", -2147483648, 28, 0, ERANGE},
+  {"-3hk7988", -2147483648, 29, 0, 0},
+  {"-3hk7989", -2147483648, 29, 0, ERANGE},
+  {"-2sb6cs8", -2147483648, 30, 0, 0},
+  {"-2sb6cs9", -2147483648, 30, 0, ERANGE},
+  {"-2d09uc2", -2147483648, 31, 0, 0},
+  {"-2d09uc3", -2147483648, 31, 0, ERANGE},
+  {"-2000000", -2147483648, 32, 0, 0},
+  {"-2000001", -2147483648, 32, 0, ERANGE},
+  {"-1lsqtl2", -2147483648, 33, 0, 0},
+  {"-1lsqtl3", -2147483648, 33, 0, ERANGE},
+  {"-1d8xqrq", -2147483648, 34, 0, 0},
+  {"-1d8xqrr", -2147483648, 34, 0, ERANGE},
+  {"-15v22un", -2147483648, 35, 0, 0},
+  {"-15v22uo", -2147483648, 35, 0, ERANGE},
+  {"-zik0zk", -2147483648, 36, 0, 0},
+  {"-zik0zl", -2147483648, 36, 0, ERANGE},
 #else
   {"9223372036854775807", 9223372036854775807, 0, 0, 0},
   {"9223372036854775808", 9223372036854775807, 0, 0, ERANGE},
@@ -74,6 +216,156 @@ static const struct ltest tests[] =
   {"-9223372036854775809", 0x8000000000000000, 0, 0, ERANGE},
   {"0x112233445566778899z", 9223372036854775807, 16, 'z', ERANGE},
   {"0xFFFFFFFFFFFF00FF" , 9223372036854775807, 0, 0, ERANGE},
+
+  {"111111111111111111111111111111111111111111111111111111111111111",
+   9223372036854775807, 2, 0, 0},
+  {"1000000000000000000000000000000000000000000000000000000000000000",
+   9223372036854775807, 2, 0, ERANGE},
+  {"2021110011022210012102010021220101220221",
+   9223372036854775807, 3, 0, 0},
+  {"2021110011022210012102010021220101220222",
+   9223372036854775807, 3, 0, ERANGE},
+  {"13333333333333333333333333333333", 9223372036854775807, 4, 0, 0},
+  {"20000000000000000000000000000000", 9223372036854775807, 4, 0, ERANGE},
+  {"1104332401304422434310311212", 9223372036854775807, 5, 0, 0},
+  {"1104332401304422434310311213", 9223372036854775807, 5, 0, ERANGE},
+  {"1540241003031030222122211", 9223372036854775807, 6, 0, 0},
+  {"1540241003031030222122212", 9223372036854775807, 6, 0, ERANGE},
+  {"22341010611245052052300", 9223372036854775807, 7, 0, 0},
+  {"22341010611245052052301", 9223372036854775807, 7, 0, ERANGE},
+  {"777777777777777777777", 9223372036854775807, 8, 0, 0},
+  {"1000000000000000000000", 9223372036854775807, 8, 0, ERANGE},
+  {"67404283172107811827", 9223372036854775807, 9, 0, 0},
+  {"67404283172107811828", 9223372036854775807, 9, 0, ERANGE},
+  {"9223372036854775807", 9223372036854775807, 10, 0, 0},
+  {"9223372036854775808", 9223372036854775807, 10, 0, ERANGE},
+  {"1728002635214590697", 9223372036854775807, 11, 0, 0},
+  {"1728002635214590698", 9223372036854775807, 11, 0, ERANGE},
+  {"41a792678515120367", 9223372036854775807, 12, 0, 0},
+  {"41a792678515120368", 9223372036854775807, 12, 0, ERANGE},
+  {"10b269549075433c37", 9223372036854775807, 13, 0, 0},
+  {"10b269549075433c38", 9223372036854775807, 13, 0, ERANGE},
+  {"4340724c6c71dc7a7", 9223372036854775807, 14, 0, 0},
+  {"4340724c6c71dc7a8", 9223372036854775807, 14, 0, ERANGE},
+  {"160e2ad3246366807", 9223372036854775807, 15, 0, 0},
+  {"160e2ad3246366808", 9223372036854775807, 15, 0, ERANGE},
+  {"7fffffffffffffff", 9223372036854775807, 16, 0, 0},
+  {"8000000000000000", 9223372036854775807, 16, 0, ERANGE},
+  {"33d3d8307b214008", 9223372036854775807, 17, 0, 0},
+  {"33d3d8307b214009", 9223372036854775807, 17, 0, ERANGE},
+  {"16agh595df825fa7", 9223372036854775807, 18, 0, 0},
+  {"16agh595df825fa8", 9223372036854775807, 18, 0, ERANGE},
+  {"ba643dci0ffeehh", 9223372036854775807, 19, 0, 0},
+  {"ba643dci0ffeehi", 9223372036854775807, 19, 0, ERANGE},
+  {"5cbfjia3fh26ja7", 9223372036854775807, 20, 0, 0},
+  {"5cbfjia3fh26ja8", 9223372036854775807, 20, 0, ERANGE},
+  {"2heiciiie82dh97", 9223372036854775807, 21, 0, 0},
+  {"2heiciiie82dh98", 9223372036854775807, 21, 0, ERANGE},
+  {"1adaibb21dckfa7", 9223372036854775807, 22, 0, 0},
+  {"1adaibb21dckfa8", 9223372036854775807, 22, 0, ERANGE},
+  {"i6k448cf4192c2", 9223372036854775807, 23, 0, 0},
+  {"i6k448cf4192c3", 9223372036854775807, 23, 0, ERANGE},
+  {"acd772jnc9l0l7", 9223372036854775807, 24, 0, 0},
+  {"acd772jnc9l0l8", 9223372036854775807, 24, 0, ERANGE},
+  {"64ie1focnn5g77", 9223372036854775807, 25, 0, 0},
+  {"64ie1focnn5g78", 9223372036854775807, 25, 0, ERANGE},
+  {"3igoecjbmca687", 9223372036854775807, 26, 0, 0},
+  {"3igoecjbmca688", 9223372036854775807, 26, 0, ERANGE},
+  {"27c48l5b37oaop", 9223372036854775807, 27, 0, 0},
+  {"27c48l5b37oaoq", 9223372036854775807, 27, 0, ERANGE},
+  {"1bk39f3ah3dmq7", 9223372036854775807, 28, 0, 0},
+  {"1bk39f3ah3dmq8", 9223372036854775807, 28, 0, ERANGE},
+  {"q1se8f0m04isb", 9223372036854775807, 29, 0, 0},
+  {"q1se8f0m04isc", 9223372036854775807, 29, 0, ERANGE},
+  {"hajppbc1fc207", 9223372036854775807, 30, 0, 0},
+  {"hajppbc1fc208", 9223372036854775807, 30, 0, ERANGE},
+  {"bm03i95hia437", 9223372036854775807, 31, 0, 0},
+  {"bm03i95hia438", 9223372036854775807, 31, 0, ERANGE},
+  {"7vvvvvvvvvvvv", 9223372036854775807, 32, 0, 0},
+  {"8000000000000", 9223372036854775807, 32, 0, ERANGE},
+  {"5hg4ck9jd4u37", 9223372036854775807, 33, 0, 0},
+  {"5hg4ck9jd4u38", 9223372036854775807, 33, 0, ERANGE},
+  {"3tdtk1v8j6tpp", 9223372036854775807, 34, 0, 0},
+  {"3tdtk1v8j6tpq", 9223372036854775807, 34, 0, ERANGE},
+  {"2pijmikexrxp7", 9223372036854775807, 35, 0, 0},
+  {"2pijmikexrxp8", 9223372036854775807, 35, 0, ERANGE},
+  {"1y2p0ij32e8e7", 9223372036854775807, 36, 0, 0},
+  {"1y2p0ij32e8e8", 9223372036854775807, 36, 0, ERANGE},
+
+  {"-1000000000000000000000000000000000000000000000000000000000000000",
+   -9223372036854775808ull, 2, 0, 0},
+  {"-1000000000000000000000000000000000000000000000000000000000000001",
+   -9223372036854775808ull, 2, 0, ERANGE},
+  {"-2021110011022210012102010021220101220222",
+   -9223372036854775808ull, 3, 0, 0},
+  {"-2021110011022210012102010021220101221000",
+   -9223372036854775808l, 3, 0, ERANGE},
+  {"-20000000000000000000000000000000", -9223372036854775808ull, 4, 0, 0},
+  {"-20000000000000000000000000000001", -9223372036854775808ull, 4, 0, ERANGE},
+  {"-1104332401304422434310311213", -9223372036854775808ull, 5, 0, 0},
+  {"-1104332401304422434310311214", -9223372036854775808ull, 5, 0, ERANGE},
+  {"-1540241003031030222122212", -9223372036854775808ull, 6, 0, 0},
+  {"-1540241003031030222122213", -9223372036854775808ull, 6, 0, ERANGE},
+  {"-22341010611245052052301", -9223372036854775808ull, 7, 0, 0},
+  {"-22341010611245052052302", -9223372036854775808ull, 7, 0, ERANGE},
+  {"-1000000000000000000000", -9223372036854775808ull, 8, 0, 0},
+  {"-1000000000000000000001", -9223372036854775808ull, 8, 0, ERANGE},
+  {"-67404283172107811828", -9223372036854775808ull, 9, 0, 0},
+  {"-67404283172107811830", -9223372036854775808ull, 9, 0, ERANGE},
+  {"-9223372036854775808", -9223372036854775808ull, 10, 0, 0},
+  {"-9223372036854775809", -9223372036854775808ull, 10, 0, ERANGE},
+  {"-1728002635214590698", -9223372036854775808ull, 11, 0, 0},
+  {"-1728002635214590699", -9223372036854775808ull, 11, 0, ERANGE},
+  {"-41a792678515120368", -9223372036854775808ull, 12, 0, 0},
+  {"-41a792678515120369", -9223372036854775808ull, 12, 0, ERANGE},
+  {"-10b269549075433c38", -9223372036854775808ull, 13, 0, 0},
+  {"-10b269549075433c39", -9223372036854775808ull, 13, 0, ERANGE},
+  {"-4340724c6c71dc7a8", -9223372036854775808ull, 14, 0, 0},
+  {"-4340724c6c71dc7a9", -9223372036854775808ull, 14, 0, ERANGE},
+  {"-160e2ad3246366808", -9223372036854775808ull, 15, 0, 0},
+  {"-160e2ad3246366809", -9223372036854775808ull, 15, 0, ERANGE},
+  {"-8000000000000000", -9223372036854775808ull, 16, 0, 0},
+  {"-8000000000000001", -9223372036854775808ull, 16, 0, ERANGE},
+  {"-33d3d8307b214009", -9223372036854775808ull, 17, 0, 0},
+  {"-33d3d8307b21400a", -9223372036854775808ull, 17, 0, ERANGE},
+  {"-16agh595df825fa8", -9223372036854775808ull, 18, 0, 0},
+  {"-16agh595df825fa9", -9223372036854775808ull, 18, 0, ERANGE},
+  {"-ba643dci0ffeehi", -9223372036854775808ull, 19, 0, 0},
+  {"-ba643dci0ffeei0", -9223372036854775808ull, 19, 0, ERANGE},
+  {"-5cbfjia3fh26ja8", -9223372036854775808ull, 20, 0, 0},
+  {"-5cbfjia3fh26ja9", -9223372036854775808ull, 20, 0, ERANGE},
+  {"-2heiciiie82dh98", -9223372036854775808ull, 21, 0, 0},
+  {"-2heiciiie82dh99", -9223372036854775808ull, 21, 0, ERANGE},
+  {"-1adaibb21dckfa8", -9223372036854775808ull, 22, 0, 0},
+  {"-1adaibb21dckfa9", -9223372036854775808ull, 22, 0, ERANGE},
+  {"-i6k448cf4192c3", -9223372036854775808ull, 23, 0, 0},
+  {"-i6k448cf4192c4", -9223372036854775808ull, 23, 0, ERANGE},
+  {"-acd772jnc9l0l8", -9223372036854775808ull, 24, 0, 0},
+  {"-acd772jnc9l0l9", -9223372036854775808ull, 24, 0, ERANGE},
+  {"-64ie1focnn5g78", -9223372036854775808ull, 25, 0, 0},
+  {"-64ie1focnn5g79", -9223372036854775808ull, 25, 0, ERANGE},
+  {"-3igoecjbmca688", -9223372036854775808ull, 26, 0, 0},
+  {"-3igoecjbmca689", -9223372036854775808ull, 26, 0, ERANGE},
+  {"-27c48l5b37oaoq", -9223372036854775808ull, 27, 0, 0},
+  {"-27c48l5b37oap0", -9223372036854775808ull, 27, 0, ERANGE},
+  {"-1bk39f3ah3dmq8", -9223372036854775808ull, 28, 0, 0},
+  {"-1bk39f3ah3dmq9", -9223372036854775808ull, 28, 0, ERANGE},
+  {"-q1se8f0m04isc", -9223372036854775808ull, 29, 0, 0},
+  {"-q1se8f0m04isd", -9223372036854775808ull, 29, 0, ERANGE},
+  {"-hajppbc1fc208", -9223372036854775808ull, 30, 0, 0},
+  {"-hajppbc1fc209", -9223372036854775808ull, 30, 0, ERANGE},
+  {"-bm03i95hia438", -9223372036854775808ull, 31, 0, 0},
+  {"-bm03i95hia439", -9223372036854775808ull, 31, 0, ERANGE},
+  {"-8000000000000", -9223372036854775808ull, 32, 0, 0},
+  {"-8000000000001", -9223372036854775808ull, 32, 0, ERANGE},
+  {"-5hg4ck9jd4u38", -9223372036854775808ull, 33, 0, 0},
+  {"-5hg4ck9jd4u39", -9223372036854775808ull, 33, 0, ERANGE},
+  {"-3tdtk1v8j6tpq", -9223372036854775808ull, 34, 0, 0},
+  {"-3tdtk1v8j6tpr", -9223372036854775808ull, 34, 0, ERANGE},
+  {"-2pijmikexrxp8", -9223372036854775808ull, 35, 0, 0},
+  {"-2pijmikexrxp9", -9223372036854775808ull, 35, 0, ERANGE},
+  {"-1y2p0ij32e8e8", -9223372036854775808ull, 36, 0, 0},
+  {"-1y2p0ij32e8e9", -9223372036854775808ull, 36, 0, ERANGE},
 #endif
   {NULL, 0, 0, 0, 0},
 
@@ -84,11 +376,157 @@ static const struct ltest tests[] =
   {"-0xfedcba98", 0x01234568, 0, 0, 0},
   {"0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE},
   {"-0x123456789", 0xffffffff, 0, 0, ERANGE},
+
+  {"11111111111111111111111111111111", 0xffffffff, 2, 0, 0},
+  {"100000000000000000000000000000000", 0xffffffff, 2, 0, ERANGE},
+  {"102002022201221111210", 0xffffffff, 3, 0, 0},
+  {"102002022201221111211", 0xffffffff, 3, 0, ERANGE},
+  {"3333333333333333", 0xffffffff, 4, 0, 0},
+  {"10000000000000000", 0xffffffff, 4, 0, ERANGE},
+  {"32244002423140", 0xffffffff, 5, 0, 0},
+  {"32244002423141", 0xffffffff, 5, 0, ERANGE},
+  {"1550104015503", 0xffffffff, 6, 0, 0},
+  {"1550104015504", 0xffffffff, 6, 0, ERANGE},
+  {"211301422353", 0xffffffff, 7, 0, 0},
+  {"211301422354", 0xffffffff, 7, 0, ERANGE},
+  {"37777777777", 0xffffffff, 8, 0, 0},
+  {"40000000000", 0xffffffff, 8, 0, ERANGE},
+  {"12068657453", 0xffffffff, 9, 0, 0},
+  {"12068657454", 0xffffffff, 9, 0, ERANGE},
+  {"4294967295", 0xffffffff, 10, 0, 0},
+  {"4294967296", 0xffffffff, 10, 0, ERANGE},
+  {"1904440553", 0xffffffff, 11, 0, 0},
+  {"1904440554", 0xffffffff, 11, 0, ERANGE},
+  {"9ba461593", 0xffffffff, 12, 0, 0},
+  {"9ba461594", 0xffffffff, 12, 0, ERANGE},
+  {"535a79888", 0xffffffff, 13, 0, 0},
+  {"535a79889", 0xffffffff, 13, 0, ERANGE},
+  {"2ca5b7463", 0xffffffff, 14, 0, 0},
+  {"2ca5b7464", 0xffffffff, 14, 0, ERANGE},
+  {"1a20dcd80", 0xffffffff, 15, 0, 0},
+  {"1a20dcd81", 0xffffffff, 15, 0, ERANGE},
+  {"ffffffff", 0xffffffff, 16, 0, 0},
+  {"100000000", 0xffffffff, 16, 0, ERANGE},
+  {"a7ffda90", 0xffffffff, 17, 0, 0},
+  {"a7ffda91", 0xffffffff, 17, 0, ERANGE},
+  {"704he7g3", 0xffffffff, 18, 0, 0},
+  {"704he7g4", 0xffffffff, 18, 0, ERANGE},
+  {"4f5aff65", 0xffffffff, 19, 0, 0},
+  {"4f5aff66", 0xffffffff, 19, 0, ERANGE},
+  {"3723ai4f", 0xffffffff, 20, 0, 0},
+  {"3723ai4g", 0xffffffff, 20, 0, ERANGE},
+  {"281d55i3", 0xffffffff, 21, 0, 0},
+  {"281d55i4", 0xffffffff, 21, 0, ERANGE},
+  {"1fj8b183", 0xffffffff, 22, 0, 0},
+  {"1fj8b184", 0xffffffff, 22, 0, ERANGE},
+  {"1606k7ib", 0xffffffff, 23, 0, 0},
+  {"1606k7ic", 0xffffffff, 23, 0, ERANGE},
+  {"mb994af", 0xffffffff, 24, 0, 0},
+  {"mb994ag", 0xffffffff, 24, 0, ERANGE},
+  {"hek2mgk", 0xffffffff, 25, 0, 0},
+  {"hek2mgl", 0xffffffff, 25, 0, ERANGE},
+  {"dnchbnl", 0xffffffff, 26, 0, 0},
+  {"dnchbnm", 0xffffffff, 26, 0, ERANGE},
+  {"b28jpdl", 0xffffffff, 27, 0, 0},
+  {"b28jpdm", 0xffffffff, 27, 0, ERANGE},
+  {"8pfgih3", 0xffffffff, 28, 0, 0},
+  {"8pfgih4", 0xffffffff, 28, 0, ERANGE},
+  {"76beigf", 0xffffffff, 29, 0, 0},
+  {"76beigg", 0xffffffff, 29, 0, ERANGE},
+  {"5qmcpqf", 0xffffffff, 30, 0, 0},
+  {"5qmcpqg", 0xffffffff, 30, 0, ERANGE},
+  {"4q0jto3", 0xffffffff, 31, 0, 0},
+  {"4q0jto4", 0xffffffff, 31, 0, ERANGE},
+  {"3vvvvvv", 0xffffffff, 32, 0, 0},
+  {"4000000", 0xffffffff, 32, 0, ERANGE},
+  {"3aokq93", 0xffffffff, 33, 0, 0},
+  {"3aokq94", 0xffffffff, 33, 0, ERANGE},
+  {"2qhxjlh", 0xffffffff, 34, 0, 0},
+  {"2qhxjli", 0xffffffff, 34, 0, ERANGE},
+  {"2br45qa", 0xffffffff, 35, 0, 0},
+  {"2br45qb", 0xffffffff, 35, 0, ERANGE},
+  {"1z141z3", 0xffffffff, 36, 0, 0},
+  {"1z141z4", 0xffffffff, 36, 0, ERANGE},
 #else
   {"0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0},
   {"-0xfedcba987654321", 0xf0123456789abcdf, 0, 0, 0},
   {"0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE},
   {"-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE},
+
+  {"1111111111111111111111111111111111111111111111111111111111111111",
+   0xffffffffffffffff, 2, 0, 0},
+  {"10000000000000000000000000000000000000000000000000000000000000000",
+   0xffffffffffffffff, 2, 0, ERANGE},
+  {"11112220022122120101211020120210210211220",
+   0xffffffffffffffff, 3, 0, 0},
+  {"11112220022122120101211020120210210211221",
+   0xffffffffffffffff, 3, 0, ERANGE},
+  {"33333333333333333333333333333333", 0xffffffffffffffff, 4, 0, 0},
+  {"100000000000000000000000000000000", 0xffffffffffffffff, 4, 0, ERANGE},
+  {"2214220303114400424121122430", 0xffffffffffffffff, 5, 0, 0},
+  {"2214220303114400424121122431", 0xffffffffffffffff, 5, 0, ERANGE},
+  {"3520522010102100444244423", 0xffffffffffffffff, 6, 0, 0},
+  {"3520522010102100444244424", 0xffffffffffffffff, 6, 0, ERANGE},
+  {"45012021522523134134601", 0xffffffffffffffff, 7, 0, 0},
+  {"45012021522523134134602", 0xffffffffffffffff, 7, 0, ERANGE},
+  {"1777777777777777777777", 0xffffffffffffffff, 8, 0, 0},
+  {"2000000000000000000000", 0xffffffffffffffff, 8, 0, ERANGE},
+  {"145808576354216723756", 0xffffffffffffffff, 9, 0, 0},
+  {"145808576354216723757", 0xffffffffffffffff, 9, 0, ERANGE},
+  {"18446744073709551615", 0xffffffffffffffff, 10, 0, 0},
+  {"18446744073709551616", 0xffffffffffffffff, 10, 0, ERANGE},
+  {"335500516a429071284", 0xffffffffffffffff, 11, 0, 0},
+  {"335500516a429071285", 0xffffffffffffffff, 11, 0, ERANGE},
+  {"839365134a2a240713", 0xffffffffffffffff, 12, 0, 0},
+  {"839365134a2a240714", 0xffffffffffffffff, 12, 0, ERANGE},
+  {"219505a9511a867b72", 0xffffffffffffffff, 13, 0, 0},
+  {"219505a9511a867b73", 0xffffffffffffffff, 13, 0, ERANGE},
+  {"8681049adb03db171", 0xffffffffffffffff, 14, 0, 0},
+  {"8681049adb03db172", 0xffffffffffffffff, 14, 0, ERANGE},
+  {"2c1d56b648c6cd110", 0xffffffffffffffff, 15, 0, 0},
+  {"2c1d56b648c6cd111", 0xffffffffffffffff, 15, 0, ERANGE},
+  {"ffffffffffffffff", 0xffffffffffffffff, 16, 0, 0},
+  {"10000000000000000", 0xffffffffffffffff, 16, 0, ERANGE},
+  {"67979g60f5428010", 0xffffffffffffffff, 17, 0, 0},
+  {"67979g60f5428011", 0xffffffffffffffff, 17, 0, ERANGE},
+  {"2d3fgb0b9cg4bd2f", 0xffffffffffffffff, 18, 0, 0},
+  {"2d3fgb0b9cg4bd2g", 0xffffffffffffffff, 18, 0, ERANGE},
+  {"141c8786h1ccaagg", 0xffffffffffffffff, 19, 0, 0},
+  {"141c8786h1ccaagh", 0xffffffffffffffff, 19, 0, ERANGE},
+  {"b53bjh07be4dj0f", 0xffffffffffffffff, 20, 0, 0},
+  {"b53bjh07be4dj0g", 0xffffffffffffffff, 20, 0, ERANGE},
+  {"5e8g4ggg7g56dif", 0xffffffffffffffff, 21, 0, 0},
+  {"5e8g4ggg7g56dig", 0xffffffffffffffff, 21, 0, ERANGE},
+  {"2l4lf104353j8kf", 0xffffffffffffffff, 22, 0, 0},
+  {"2l4lf104353j8kg", 0xffffffffffffffff, 22, 0, ERANGE},
+  {"1ddh88h2782i515", 0xffffffffffffffff, 23, 0, 0},
+  {"1ddh88h2782i516", 0xffffffffffffffff, 23, 0, ERANGE},
+  {"l12ee5fn0ji1if", 0xffffffffffffffff, 24, 0, 0},
+  {"l12ee5fn0ji1ig", 0xffffffffffffffff, 24, 0, ERANGE},
+  {"c9c336o0mlb7ef", 0xffffffffffffffff, 25, 0, 0},
+  {"c9c336o0mlb7eg", 0xffffffffffffffff, 25, 0, ERANGE},
+  {"7b7n2pcniokcgf", 0xffffffffffffffff, 26, 0, 0},
+  {"7b7n2pcniokcgg", 0xffffffffffffffff, 26, 0, ERANGE},
+  {"4eo8hfam6fllmo", 0xffffffffffffffff, 27, 0, 0},
+  {"4eo8hfam6fllmp", 0xffffffffffffffff, 27, 0, ERANGE},
+  {"2nc6j26l66rhof", 0xffffffffffffffff, 28, 0, 0},
+  {"2nc6j26l66rhog", 0xffffffffffffffff, 28, 0, ERANGE},
+  {"1n3rsh11f098rn", 0xffffffffffffffff, 29, 0, 0},
+  {"1n3rsh11f098ro", 0xffffffffffffffff, 29, 0, ERANGE},
+  {"14l9lkmo30o40f", 0xffffffffffffffff, 30, 0, 0},
+  {"14l9lkmo30o40g", 0xffffffffffffffff, 30, 0, ERANGE},
+  {"nd075ib45k86f", 0xffffffffffffffff, 31, 0, 0},
+  {"nd075ib45k86g", 0xffffffffffffffff, 31, 0, ERANGE},
+  {"fvvvvvvvvvvvv", 0xffffffffffffffff, 32, 0, 0},
+  {"g000000000000", 0xffffffffffffffff, 32, 0, ERANGE},
+  {"b1w8p7j5q9r6f", 0xffffffffffffffff, 33, 0, 0},
+  {"b1w8p7j5q9r6g", 0xffffffffffffffff, 33, 0, ERANGE},
+  {"7orp63sh4dphh", 0xffffffffffffffff, 34, 0, 0},
+  {"7orp63sh4dphi", 0xffffffffffffffff, 34, 0, ERANGE},
+  {"5g24a25twkwff", 0xffffffffffffffff, 35, 0, 0},
+  {"5g24a25twkwfg", 0xffffffffffffffff, 35, 0, ERANGE},
+  {"3w5e11264sgsf", 0xffffffffffffffff, 36, 0, 0},
+  {"3w5e11264sgsg", 0xffffffffffffffff, 36, 0, ERANGE},
 #endif
   {NULL, 0, 0, 0, 0},
   };
diff --git a/stdlib/tst-strtoll.c b/stdlib/tst-strtoll.c
index 9007488d80..a5a1eb07d9 100644
--- a/stdlib/tst-strtoll.c
+++ b/stdlib/tst-strtoll.c
@@ -69,6 +69,156 @@ static const struct ltest tests[] =
   {"-9223372036854775809", -9223372036854775807ll - 1, 0, 0, ERANGE},
   {"0x112233445566778899z", 9223372036854775807ll, 16, 'z', ERANGE},
   {"0xFFFFFFFFFFFF00FF" , 9223372036854775807ll, 0, 0, ERANGE},
+
+  {"111111111111111111111111111111111111111111111111111111111111111",
+   9223372036854775807ll, 2, 0, 0},
+  {"1000000000000000000000000000000000000000000000000000000000000000",
+   9223372036854775807ll, 2, 0, ERANGE},
+  {"2021110011022210012102010021220101220221",
+   9223372036854775807ll, 3, 0, 0},
+  {"2021110011022210012102010021220101220222",
+   9223372036854775807ll, 3, 0, ERANGE},
+  {"13333333333333333333333333333333", 9223372036854775807ll, 4, 0, 0},
+  {"20000000000000000000000000000000", 9223372036854775807ll, 4, 0, ERANGE},
+  {"1104332401304422434310311212", 9223372036854775807ll, 5, 0, 0},
+  {"1104332401304422434310311213", 9223372036854775807ll, 5, 0, ERANGE},
+  {"1540241003031030222122211", 9223372036854775807ll, 6, 0, 0},
+  {"1540241003031030222122212", 9223372036854775807ll, 6, 0, ERANGE},
+  {"22341010611245052052300", 9223372036854775807ll, 7, 0, 0},
+  {"22341010611245052052301", 9223372036854775807ll, 7, 0, ERANGE},
+  {"777777777777777777777", 9223372036854775807ll, 8, 0, 0},
+  {"1000000000000000000000", 9223372036854775807ll, 8, 0, ERANGE},
+  {"67404283172107811827", 9223372036854775807ll, 9, 0, 0},
+  {"67404283172107811828", 9223372036854775807ll, 9, 0, ERANGE},
+  {"9223372036854775807", 9223372036854775807ll, 10, 0, 0},
+  {"9223372036854775808", 9223372036854775807ll, 10, 0, ERANGE},
+  {"1728002635214590697", 9223372036854775807ll, 11, 0, 0},
+  {"1728002635214590698", 9223372036854775807ll, 11, 0, ERANGE},
+  {"41a792678515120367", 9223372036854775807ll, 12, 0, 0},
+  {"41a792678515120368", 9223372036854775807ll, 12, 0, ERANGE},
+  {"10b269549075433c37", 9223372036854775807ll, 13, 0, 0},
+  {"10b269549075433c38", 9223372036854775807ll, 13, 0, ERANGE},
+  {"4340724c6c71dc7a7", 9223372036854775807ll, 14, 0, 0},
+  {"4340724c6c71dc7a8", 9223372036854775807ll, 14, 0, ERANGE},
+  {"160e2ad3246366807", 9223372036854775807ll, 15, 0, 0},
+  {"160e2ad3246366808", 9223372036854775807ll, 15, 0, ERANGE},
+  {"7fffffffffffffff", 9223372036854775807ll, 16, 0, 0},
+  {"8000000000000000", 9223372036854775807ll, 16, 0, ERANGE},
+  {"33d3d8307b214008", 9223372036854775807ll, 17, 0, 0},
+  {"33d3d8307b214009", 9223372036854775807ll, 17, 0, ERANGE},
+  {"16agh595df825fa7", 9223372036854775807ll, 18, 0, 0},
+  {"16agh595df825fa8", 9223372036854775807ll, 18, 0, ERANGE},
+  {"ba643dci0ffeehh", 9223372036854775807ll, 19, 0, 0},
+  {"ba643dci0ffeehi", 9223372036854775807ll, 19, 0, ERANGE},
+  {"5cbfjia3fh26ja7", 9223372036854775807ll, 20, 0, 0},
+  {"5cbfjia3fh26ja8", 9223372036854775807ll, 20, 0, ERANGE},
+  {"2heiciiie82dh97", 9223372036854775807ll, 21, 0, 0},
+  {"2heiciiie82dh98", 9223372036854775807ll, 21, 0, ERANGE},
+  {"1adaibb21dckfa7", 9223372036854775807ll, 22, 0, 0},
+  {"1adaibb21dckfa8", 9223372036854775807ll, 22, 0, ERANGE},
+  {"i6k448cf4192c2", 9223372036854775807ll, 23, 0, 0},
+  {"i6k448cf4192c3", 9223372036854775807ll, 23, 0, ERANGE},
+  {"acd772jnc9l0l7", 9223372036854775807ll, 24, 0, 0},
+  {"acd772jnc9l0l8", 9223372036854775807ll, 24, 0, ERANGE},
+  {"64ie1focnn5g77", 9223372036854775807ll, 25, 0, 0},
+  {"64ie1focnn5g78", 9223372036854775807ll, 25, 0, ERANGE},
+  {"3igoecjbmca687", 9223372036854775807ll, 26, 0, 0},
+  {"3igoecjbmca688", 9223372036854775807ll, 26, 0, ERANGE},
+  {"27c48l5b37oaop", 9223372036854775807ll, 27, 0, 0},
+  {"27c48l5b37oaoq", 9223372036854775807ll, 27, 0, ERANGE},
+  {"1bk39f3ah3dmq7", 9223372036854775807ll, 28, 0, 0},
+  {"1bk39f3ah3dmq8", 9223372036854775807ll, 28, 0, ERANGE},
+  {"q1se8f0m04isb", 9223372036854775807ll, 29, 0, 0},
+  {"q1se8f0m04isc", 9223372036854775807ll, 29, 0, ERANGE},
+  {"hajppbc1fc207", 9223372036854775807ll, 30, 0, 0},
+  {"hajppbc1fc208", 9223372036854775807ll, 30, 0, ERANGE},
+  {"bm03i95hia437", 9223372036854775807ll, 31, 0, 0},
+  {"bm03i95hia438", 9223372036854775807ll, 31, 0, ERANGE},
+  {"7vvvvvvvvvvvv", 9223372036854775807ll, 32, 0, 0},
+  {"8000000000000", 9223372036854775807ll, 32, 0, ERANGE},
+  {"5hg4ck9jd4u37", 9223372036854775807ll, 33, 0, 0},
+  {"5hg4ck9jd4u38", 9223372036854775807ll, 33, 0, ERANGE},
+  {"3tdtk1v8j6tpp", 9223372036854775807ll, 34, 0, 0},
+  {"3tdtk1v8j6tpq", 9223372036854775807ll, 34, 0, ERANGE},
+  {"2pijmikexrxp7", 9223372036854775807ll, 35, 0, 0},
+  {"2pijmikexrxp8", 9223372036854775807ll, 35, 0, ERANGE},
+  {"1y2p0ij32e8e7", 9223372036854775807ll, 36, 0, 0},
+  {"1y2p0ij32e8e8", 9223372036854775807ll, 36, 0, ERANGE},
+
+  {"-1000000000000000000000000000000000000000000000000000000000000000",
+   -9223372036854775808ull, 2, 0, 0},
+  {"-1000000000000000000000000000000000000000000000000000000000000001",
+   -9223372036854775808ull, 2, 0, ERANGE},
+  {"-2021110011022210012102010021220101220222",
+   -9223372036854775808ull, 3, 0, 0},
+  {"-2021110011022210012102010021220101221000",
+   -9223372036854775808l, 3, 0, ERANGE},
+  {"-20000000000000000000000000000000", -9223372036854775808ull, 4, 0, 0},
+  {"-20000000000000000000000000000001", -9223372036854775808ull, 4, 0, ERANGE},
+  {"-1104332401304422434310311213", -9223372036854775808ull, 5, 0, 0},
+  {"-1104332401304422434310311214", -9223372036854775808ull, 5, 0, ERANGE},
+  {"-1540241003031030222122212", -9223372036854775808ull, 6, 0, 0},
+  {"-1540241003031030222122213", -9223372036854775808ull, 6, 0, ERANGE},
+  {"-22341010611245052052301", -9223372036854775808ull, 7, 0, 0},
+  {"-22341010611245052052302", -9223372036854775808ull, 7, 0, ERANGE},
+  {"-1000000000000000000000", -9223372036854775808ull, 8, 0, 0},
+  {"-1000000000000000000001", -9223372036854775808ull, 8, 0, ERANGE},
+  {"-67404283172107811828", -9223372036854775808ull, 9, 0, 0},
+  {"-67404283172107811830", -9223372036854775808ull, 9, 0, ERANGE},
+  {"-9223372036854775808", -9223372036854775808ull, 10, 0, 0},
+  {"-9223372036854775809", -9223372036854775808ull, 10, 0, ERANGE},
+  {"-1728002635214590698", -9223372036854775808ull, 11, 0, 0},
+  {"-1728002635214590699", -9223372036854775808ull, 11, 0, ERANGE},
+  {"-41a792678515120368", -9223372036854775808ull, 12, 0, 0},
+  {"-41a792678515120369", -9223372036854775808ull, 12, 0, ERANGE},
+  {"-10b269549075433c38", -9223372036854775808ull, 13, 0, 0},
+  {"-10b269549075433c39", -9223372036854775808ull, 13, 0, ERANGE},
+  {"-4340724c6c71dc7a8", -9223372036854775808ull, 14, 0, 0},
+  {"-4340724c6c71dc7a9", -9223372036854775808ull, 14, 0, ERANGE},
+  {"-160e2ad3246366808", -9223372036854775808ull, 15, 0, 0},
+  {"-160e2ad3246366809", -9223372036854775808ull, 15, 0, ERANGE},
+  {"-8000000000000000", -9223372036854775808ull, 16, 0, 0},
+  {"-8000000000000001", -9223372036854775808ull, 16, 0, ERANGE},
+  {"-33d3d8307b214009", -9223372036854775808ull, 17, 0, 0},
+  {"-33d3d8307b21400a", -9223372036854775808ull, 17, 0, ERANGE},
+  {"-16agh595df825fa8", -9223372036854775808ull, 18, 0, 0},
+  {"-16agh595df825fa9", -9223372036854775808ull, 18, 0, ERANGE},
+  {"-ba643dci0ffeehi", -9223372036854775808ull, 19, 0, 0},
+  {"-ba643dci0ffeei0", -9223372036854775808ull, 19, 0, ERANGE},
+  {"-5cbfjia3fh26ja8", -9223372036854775808ull, 20, 0, 0},
+  {"-5cbfjia3fh26ja9", -9223372036854775808ull, 20, 0, ERANGE},
+  {"-2heiciiie82dh98", -9223372036854775808ull, 21, 0, 0},
+  {"-2heiciiie82dh99", -9223372036854775808ull, 21, 0, ERANGE},
+  {"-1adaibb21dckfa8", -9223372036854775808ull, 22, 0, 0},
+  {"-1adaibb21dckfa9", -9223372036854775808ull, 22, 0, ERANGE},
+  {"-i6k448cf4192c3", -9223372036854775808ull, 23, 0, 0},
+  {"-i6k448cf4192c4", -9223372036854775808ull, 23, 0, ERANGE},
+  {"-acd772jnc9l0l8", -9223372036854775808ull, 24, 0, 0},
+  {"-acd772jnc9l0l9", -9223372036854775808ull, 24, 0, ERANGE},
+  {"-64ie1focnn5g78", -9223372036854775808ull, 25, 0, 0},
+  {"-64ie1focnn5g79", -9223372036854775808ull, 25, 0, ERANGE},
+  {"-3igoecjbmca688", -9223372036854775808ull, 26, 0, 0},
+  {"-3igoecjbmca689", -9223372036854775808ull, 26, 0, ERANGE},
+  {"-27c48l5b37oaoq", -9223372036854775808ull, 27, 0, 0},
+  {"-27c48l5b37oap0", -9223372036854775808ull, 27, 0, ERANGE},
+  {"-1bk39f3ah3dmq8", -9223372036854775808ull, 28, 0, 0},
+  {"-1bk39f3ah3dmq9", -9223372036854775808ull, 28, 0, ERANGE},
+  {"-q1se8f0m04isc", -9223372036854775808ull, 29, 0, 0},
+  {"-q1se8f0m04isd", -9223372036854775808ull, 29, 0, ERANGE},
+  {"-hajppbc1fc208", -9223372036854775808ull, 30, 0, 0},
+  {"-hajppbc1fc209", -9223372036854775808ull, 30, 0, ERANGE},
+  {"-bm03i95hia438", -9223372036854775808ull, 31, 0, 0},
+  {"-bm03i95hia439", -9223372036854775808ull, 31, 0, ERANGE},
+  {"-8000000000000", -9223372036854775808ull, 32, 0, 0},
+  {"-8000000000001", -9223372036854775808ull, 32, 0, ERANGE},
+  {"-5hg4ck9jd4u38", -9223372036854775808ull, 33, 0, 0},
+  {"-5hg4ck9jd4u39", -9223372036854775808ull, 33, 0, ERANGE},
+  {"-3tdtk1v8j6tpq", -9223372036854775808ull, 34, 0, 0},
+  {"-3tdtk1v8j6tpr", -9223372036854775808ull, 34, 0, ERANGE},
+  {"-2pijmikexrxp8", -9223372036854775808ull, 35, 0, 0},
+  {"-2pijmikexrxp9", -9223372036854775808ull, 35, 0, ERANGE},
+  {"-1y2p0ij32e8e8", -9223372036854775808ull, 36, 0, 0},
+  {"-1y2p0ij32e8e9", -9223372036854775808ull, 36, 0, ERANGE},
   {NULL, 0, 0, 0, 0},
 
   /* Then unsigned.  */
@@ -78,6 +228,81 @@ static const struct ltest tests[] =
   {"-0xfedcba987654321", 0xf0123456789abcdfull, 0, 0, 0},
   {"0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffffull, 0, 0, ERANGE},
   {"-0x123456789abcdef01", 0xffffffffffffffffull, 0, 0, ERANGE},
+
+  {"1111111111111111111111111111111111111111111111111111111111111111",
+   0xffffffffffffffff, 2, 0, 0},
+  {"10000000000000000000000000000000000000000000000000000000000000000",
+   0xffffffffffffffff, 2, 0, ERANGE},
+  {"11112220022122120101211020120210210211220",
+   0xffffffffffffffff, 3, 0, 0},
+  {"11112220022122120101211020120210210211221",
+   0xffffffffffffffff, 3, 0, ERANGE},
+  {"33333333333333333333333333333333", 0xffffffffffffffff, 4, 0, 0},
+  {"100000000000000000000000000000000", 0xffffffffffffffff, 4, 0, ERANGE},
+  {"2214220303114400424121122430", 0xffffffffffffffff, 5, 0, 0},
+  {"2214220303114400424121122431", 0xffffffffffffffff, 5, 0, ERANGE},
+  {"3520522010102100444244423", 0xffffffffffffffff, 6, 0, 0},
+  {"3520522010102100444244424", 0xffffffffffffffff, 6, 0, ERANGE},
+  {"45012021522523134134601", 0xffffffffffffffff, 7, 0, 0},
+  {"45012021522523134134602", 0xffffffffffffffff, 7, 0, ERANGE},
+  {"1777777777777777777777", 0xffffffffffffffff, 8, 0, 0},
+  {"2000000000000000000000", 0xffffffffffffffff, 8, 0, ERANGE},
+  {"145808576354216723756", 0xffffffffffffffff, 9, 0, 0},
+  {"145808576354216723757", 0xffffffffffffffff, 9, 0, ERANGE},
+  {"18446744073709551615", 0xffffffffffffffff, 10, 0, 0},
+  {"18446744073709551616", 0xffffffffffffffff, 10, 0, ERANGE},
+  {"335500516a429071284", 0xffffffffffffffff, 11, 0, 0},
+  {"335500516a429071285", 0xffffffffffffffff, 11, 0, ERANGE},
+  {"839365134a2a240713", 0xffffffffffffffff, 12, 0, 0},
+  {"839365134a2a240714", 0xffffffffffffffff, 12, 0, ERANGE},
+  {"219505a9511a867b72", 0xffffffffffffffff, 13, 0, 0},
+  {"219505a9511a867b73", 0xffffffffffffffff, 13, 0, ERANGE},
+  {"8681049adb03db171", 0xffffffffffffffff, 14, 0, 0},
+  {"8681049adb03db172", 0xffffffffffffffff, 14, 0, ERANGE},
+  {"2c1d56b648c6cd110", 0xffffffffffffffff, 15, 0, 0},
+  {"2c1d56b648c6cd111", 0xffffffffffffffff, 15, 0, ERANGE},
+  {"ffffffffffffffff", 0xffffffffffffffff, 16, 0, 0},
+  {"10000000000000000", 0xffffffffffffffff, 16, 0, ERANGE},
+  {"67979g60f5428010", 0xffffffffffffffff, 17, 0, 0},
+  {"67979g60f5428011", 0xffffffffffffffff, 17, 0, ERANGE},
+  {"2d3fgb0b9cg4bd2f", 0xffffffffffffffff, 18, 0, 0},
+  {"2d3fgb0b9cg4bd2g", 0xffffffffffffffff, 18, 0, ERANGE},
+  {"141c8786h1ccaagg", 0xffffffffffffffff, 19, 0, 0},
+  {"141c8786h1ccaagh", 0xffffffffffffffff, 19, 0, ERANGE},
+  {"b53bjh07be4dj0f", 0xffffffffffffffff, 20, 0, 0},
+  {"b53bjh07be4dj0g", 0xffffffffffffffff, 20, 0, ERANGE},
+  {"5e8g4ggg7g56dif", 0xffffffffffffffff, 21, 0, 0},
+  {"5e8g4ggg7g56dig", 0xffffffffffffffff, 21, 0, ERANGE},
+  {"2l4lf104353j8kf", 0xffffffffffffffff, 22, 0, 0},
+  {"2l4lf104353j8kg", 0xffffffffffffffff, 22, 0, ERANGE},
+  {"1ddh88h2782i515", 0xffffffffffffffff, 23, 0, 0},
+  {"1ddh88h2782i516", 0xffffffffffffffff, 23, 0, ERANGE},
+  {"l12ee5fn0ji1if", 0xffffffffffffffff, 24, 0, 0},
+  {"l12ee5fn0ji1ig", 0xffffffffffffffff, 24, 0, ERANGE},
+  {"c9c336o0mlb7ef", 0xffffffffffffffff, 25, 0, 0},
+  {"c9c336o0mlb7eg", 0xffffffffffffffff, 25, 0, ERANGE},
+  {"7b7n2pcniokcgf", 0xffffffffffffffff, 26, 0, 0},
+  {"7b7n2pcniokcgg", 0xffffffffffffffff, 26, 0, ERANGE},
+  {"4eo8hfam6fllmo", 0xffffffffffffffff, 27, 0, 0},
+  {"4eo8hfam6fllmp", 0xffffffffffffffff, 27, 0, ERANGE},
+  {"2nc6j26l66rhof", 0xffffffffffffffff, 28, 0, 0},
+  {"2nc6j26l66rhog", 0xffffffffffffffff, 28, 0, ERANGE},
+  {"1n3rsh11f098rn", 0xffffffffffffffff, 29, 0, 0},
+  {"1n3rsh11f098ro", 0xffffffffffffffff, 29, 0, ERANGE},
+  {"14l9lkmo30o40f", 0xffffffffffffffff, 30, 0, 0},
+  {"14l9lkmo30o40g", 0xffffffffffffffff, 30, 0, ERANGE},
+  {"nd075ib45k86f", 0xffffffffffffffff, 31, 0, 0},
+  {"nd075ib45k86g", 0xffffffffffffffff, 31, 0, ERANGE},
+  {"fvvvvvvvvvvvv", 0xffffffffffffffff, 32, 0, 0},
+  {"g000000000000", 0xffffffffffffffff, 32, 0, ERANGE},
+  {"b1w8p7j5q9r6f", 0xffffffffffffffff, 33, 0, 0},
+  {"b1w8p7j5q9r6g", 0xffffffffffffffff, 33, 0, ERANGE},
+  {"7orp63sh4dphh", 0xffffffffffffffff, 34, 0, 0},
+  {"7orp63sh4dphi", 0xffffffffffffffff, 34, 0, ERANGE},
+  {"5g24a25twkwff", 0xffffffffffffffff, 35, 0, 0},
+  {"5g24a25twkwfg", 0xffffffffffffffff, 35, 0, ERANGE},
+  {"3w5e11264sgsf", 0xffffffffffffffff, 36, 0, 0},
+  {"3w5e11264sgsg", 0xffffffffffffffff, 36, 0, ERANGE},
   {NULL, 0, 0, 0, 0},
   };
 
diff --git a/sysdeps/i386/i686/multiarch/init-arch.c b/sysdeps/i386/i686/multiarch/init-arch.c
index b371bae1dc..00a94d83dc 100644
--- a/sysdeps/i386/i686/multiarch/init-arch.c
+++ b/sysdeps/i386/i686/multiarch/init-arch.c
@@ -1,3 +1 @@
-#define ENABLE_SSSE3_ON_ATOM
-
 #include <sysdeps/x86_64/multiarch/init-arch.c>
diff --git a/sysdeps/x86_64/fpu/bits/mathinline.h b/sysdeps/x86_64/fpu/bits/mathinline.h
index 8d4850dfc0..ece0f02678 100644
--- a/sysdeps/x86_64/fpu/bits/mathinline.h
+++ b/sysdeps/x86_64/fpu/bits/mathinline.h
@@ -36,14 +36,14 @@ __MATH_INLINE int
 __NTH (__signbitf (float __x))
 {
   int __m;
-  asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+  __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
   return __m & 0x8;
 }
 __MATH_INLINE int
 __NTH (__signbit (double __x))
 {
   int __m;
-  asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
+  __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x));
   return __m & 0x80;
 }
 __MATH_INLINE int
diff --git a/sysdeps/x86_64/multiarch/init-arch.c b/sysdeps/x86_64/multiarch/init-arch.c
index c152ab29eb..9a1e776c9a 100644
--- a/sysdeps/x86_64/multiarch/init-arch.c
+++ b/sysdeps/x86_64/multiarch/init-arch.c
@@ -64,15 +64,7 @@ __init_cpu_features (void)
 	  __cpu_features.model += extended_model;
 	}
       else if (__cpu_features.family == 0x06)
-	{
-	  __cpu_features.model += extended_model;
-
-#ifndef ENABLE_SSSE3_ON_ATOM
-	  if (__cpu_features.model == 0x1c)
-	    /* Avoid SSSE3 on Atom since it is slow.  */
-	    __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx &= ~(1 << 9);
-#endif
-	}
+	__cpu_features.model += extended_model;
     }
   /* This spells out "AuthenticAMD".  */
   else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)