Optimized memcmp and wmemcmp for x86-64 and x86-32
[jlayton/glibc.git] / string / bzero.c
1 /* Copyright (C) 1991, 1997, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Torbjorn Granlund (tege@sics.se).
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <string.h>
21 #include <memcopy.h>
22
23 #undef __bzero
24
25 /* Set N bytes of S to 0.  */
26 void
27 __bzero (s, len)
28      void *s;
29      size_t len;
30 {
31   long int dstp = (long int) s;
32   const op_t zero = 0;
33
34   if (len >= 8)
35     {
36       size_t xlen;
37
38       /* There are at least some bytes to zero.  No need to test
39          for LEN == 0 in this alignment loop.  */
40       while (dstp % OPSIZ != 0)
41         {
42           ((byte *) dstp)[0] = 0;
43           dstp += 1;
44           len -= 1;
45         }
46
47       /* Write 8 op_t per iteration until less than 8 op_t remain.  */
48       xlen = len / (OPSIZ * 8);
49       while (xlen != 0)
50         {
51           ((op_t *) dstp)[0] = zero;
52           ((op_t *) dstp)[1] = zero;
53           ((op_t *) dstp)[2] = zero;
54           ((op_t *) dstp)[3] = zero;
55           ((op_t *) dstp)[4] = zero;
56           ((op_t *) dstp)[5] = zero;
57           ((op_t *) dstp)[6] = zero;
58           ((op_t *) dstp)[7] = zero;
59           dstp += 8 * OPSIZ;
60           xlen -= 1;
61         }
62       len %= OPSIZ * 8;
63
64       /* Write 1 op_t per iteration until less than op_t remain.  */
65       xlen = len / OPSIZ;
66       while (xlen != 0)
67         {
68           ((op_t *) dstp)[0] = zero;
69           dstp += OPSIZ;
70           xlen -= 1;
71         }
72       len %= OPSIZ;
73     }
74
75   /* Write the last few bytes.  */
76   while (len != 0)
77     {
78       ((byte *) dstp)[0] = 0;
79       dstp += 1;
80       len -= 1;
81     }
82 }
83 weak_alias (__bzero, bzero)