~linaro-toolchain-dev/cortex-strings/trunk

« back to all changes in this revision

Viewing changes to reference/glibc-c/memchr.c

  • Committer: Michael Hope
  • Date: 2012-06-12 03:19:48 UTC
  • Revision ID: michael.hope@linaro.org-20120612031948-4ii8jicywtzjprak
Added the C only routines from GLIBC 2.16+20120607~git24a6dbe

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 1991,93,96,97,99,2000,2003,2012 Free Software Foundation, Inc.
 
2
   This file is part of the GNU C Library.
 
3
   Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
 
4
   with help from Dan Sahlin (dan@sics.se) and
 
5
   commentary by Jim Blandy (jimb@ai.mit.edu);
 
6
   adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
 
7
   and implemented by Roland McGrath (roland@ai.mit.edu).
 
8
 
 
9
   The GNU C Library is free software; you can redistribute it and/or
 
10
   modify it under the terms of the GNU Lesser General Public
 
11
   License as published by the Free Software Foundation; either
 
12
   version 2.1 of the License, or (at your option) any later version.
 
13
 
 
14
   The GNU C Library is distributed in the hope that it will be useful,
 
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
17
   Lesser General Public License for more details.
 
18
 
 
19
   You should have received a copy of the GNU Lesser General Public
 
20
   License along with the GNU C Library; if not, see
 
21
   <http://www.gnu.org/licenses/>.  */
 
22
 
 
23
#ifdef HAVE_CONFIG_H
 
24
#include <config.h>
 
25
#endif
 
26
 
 
27
#undef __ptr_t
 
28
#define __ptr_t void *
 
29
 
 
30
#if defined _LIBC
 
31
# include <string.h>
 
32
# include <memcopy.h>
 
33
#endif
 
34
 
 
35
#if HAVE_STDLIB_H || defined _LIBC
 
36
# include <stdlib.h>
 
37
#endif
 
38
 
 
39
#if HAVE_LIMITS_H || defined _LIBC
 
40
# include <limits.h>
 
41
#endif
 
42
 
 
43
#define LONG_MAX_32_BITS 2147483647
 
44
 
 
45
#ifndef LONG_MAX
 
46
#define LONG_MAX LONG_MAX_32_BITS
 
47
#endif
 
48
 
 
49
#include <sys/types.h>
 
50
#if HAVE_BP_SYM_H || defined _LIBC
 
51
#include <bp-sym.h>
 
52
#else
 
53
# define BP_SYM(sym) sym
 
54
#endif
 
55
 
 
56
#undef memchr
 
57
#undef __memchr
 
58
 
 
59
/* Search no more than N bytes of S for C.  */
 
60
__ptr_t
 
61
memchr (s, c_in, n)
 
62
     const __ptr_t s;
 
63
     int c_in;
 
64
     size_t n;
 
65
{
 
66
  const unsigned char *char_ptr;
 
67
  const unsigned long int *longword_ptr;
 
68
  unsigned long int longword, magic_bits, charmask;
 
69
  unsigned char c;
 
70
 
 
71
  c = (unsigned char) c_in;
 
72
 
 
73
  /* Handle the first few characters by reading one character at a time.
 
74
     Do this until CHAR_PTR is aligned on a longword boundary.  */
 
75
  for (char_ptr = (const unsigned char *) s;
 
76
       n > 0 && ((unsigned long int) char_ptr
 
77
                 & (sizeof (longword) - 1)) != 0;
 
78
       --n, ++char_ptr)
 
79
    if (*char_ptr == c)
 
80
      return (__ptr_t) char_ptr;
 
81
 
 
82
  /* All these elucidatory comments refer to 4-byte longwords,
 
83
     but the theory applies equally well to 8-byte longwords.  */
 
84
 
 
85
  longword_ptr = (unsigned long int *) char_ptr;
 
86
 
 
87
  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
 
88
     the "holes."  Note that there is a hole just to the left of
 
89
     each byte, with an extra at the end:
 
90
 
 
91
     bits:  01111110 11111110 11111110 11111111
 
92
     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
 
93
 
 
94
     The 1-bits make sure that carries propagate to the next 0-bit.
 
95
     The 0-bits provide holes for carries to fall into.  */
 
96
 
 
97
  if (sizeof (longword) != 4 && sizeof (longword) != 8)
 
98
    abort ();
 
99
 
 
100
#if LONG_MAX <= LONG_MAX_32_BITS
 
101
  magic_bits = 0x7efefeff;
 
102
#else
 
103
  magic_bits = ((unsigned long int) 0x7efefefe << 32) | 0xfefefeff;
 
104
#endif
 
105
 
 
106
  /* Set up a longword, each of whose bytes is C.  */
 
107
  charmask = c | (c << 8);
 
108
  charmask |= charmask << 16;
 
109
#if LONG_MAX > LONG_MAX_32_BITS
 
110
  charmask |= charmask << 32;
 
111
#endif
 
112
 
 
113
  /* Instead of the traditional loop which tests each character,
 
114
     we will test a longword at a time.  The tricky part is testing
 
115
     if *any of the four* bytes in the longword in question are zero.  */
 
116
  while (n >= sizeof (longword))
 
117
    {
 
118
      /* We tentatively exit the loop if adding MAGIC_BITS to
 
119
         LONGWORD fails to change any of the hole bits of LONGWORD.
 
120
 
 
121
         1) Is this safe?  Will it catch all the zero bytes?
 
122
         Suppose there is a byte with all zeros.  Any carry bits
 
123
         propagating from its left will fall into the hole at its
 
124
         least significant bit and stop.  Since there will be no
 
125
         carry from its most significant bit, the LSB of the
 
126
         byte to the left will be unchanged, and the zero will be
 
127
         detected.
 
128
 
 
129
         2) Is this worthwhile?  Will it ignore everything except
 
130
         zero bytes?  Suppose every byte of LONGWORD has a bit set
 
131
         somewhere.  There will be a carry into bit 8.  If bit 8
 
132
         is set, this will carry into bit 16.  If bit 8 is clear,
 
133
         one of bits 9-15 must be set, so there will be a carry
 
134
         into bit 16.  Similarly, there will be a carry into bit
 
135
         24.  If one of bits 24-30 is set, there will be a carry
 
136
         into bit 31, so all of the hole bits will be changed.
 
137
 
 
138
         The one misfire occurs when bits 24-30 are clear and bit
 
139
         31 is set; in this case, the hole at bit 31 is not
 
140
         changed.  If we had access to the processor carry flag,
 
141
         we could close this loophole by putting the fourth hole
 
142
         at bit 32!
 
143
 
 
144
         So it ignores everything except 128's, when they're aligned
 
145
         properly.
 
146
 
 
147
         3) But wait!  Aren't we looking for C, not zero?
 
148
         Good point.  So what we do is XOR LONGWORD with a longword,
 
149
         each of whose bytes is C.  This turns each byte that is C
 
150
         into a zero.  */
 
151
 
 
152
      longword = *longword_ptr++ ^ charmask;
 
153
 
 
154
      /* Add MAGIC_BITS to LONGWORD.  */
 
155
      if ((((longword + magic_bits)
 
156
 
 
157
            /* Set those bits that were unchanged by the addition.  */
 
158
            ^ ~longword)
 
159
 
 
160
           /* Look at only the hole bits.  If any of the hole bits
 
161
              are unchanged, most likely one of the bytes was a
 
162
              zero.  */
 
163
           & ~magic_bits) != 0)
 
164
        {
 
165
          /* Which of the bytes was C?  If none of them were, it was
 
166
             a misfire; continue the search.  */
 
167
 
 
168
          const unsigned char *cp = (const unsigned char *) (longword_ptr - 1);
 
169
 
 
170
          if (cp[0] == c)
 
171
            return (__ptr_t) cp;
 
172
          if (cp[1] == c)
 
173
            return (__ptr_t) &cp[1];
 
174
          if (cp[2] == c)
 
175
            return (__ptr_t) &cp[2];
 
176
          if (cp[3] == c)
 
177
            return (__ptr_t) &cp[3];
 
178
#if LONG_MAX > 2147483647
 
179
          if (cp[4] == c)
 
180
            return (__ptr_t) &cp[4];
 
181
          if (cp[5] == c)
 
182
            return (__ptr_t) &cp[5];
 
183
          if (cp[6] == c)
 
184
            return (__ptr_t) &cp[6];
 
185
          if (cp[7] == c)
 
186
            return (__ptr_t) &cp[7];
 
187
#endif
 
188
        }
 
189
 
 
190
      n -= sizeof (longword);
 
191
    }
 
192
 
 
193
  char_ptr = (const unsigned char *) longword_ptr;
 
194
 
 
195
  while (n-- > 0)
 
196
    {
 
197
      if (*char_ptr == c)
 
198
        return (__ptr_t) char_ptr;
 
199
      else
 
200
        ++char_ptr;
 
201
    }
 
202
 
 
203
  return 0;
 
204
}