powerpc: Fix ifuncmain6pie failure with GCC 4.9
[platform/upstream/glibc.git] / string / bzero.c
1 /* Copyright (C) 1991-2015 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, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <string.h>
20 #include <memcopy.h>
21
22 #undef __bzero
23
24 /* Set N bytes of S to 0.  */
25 void
26 __bzero (s, len)
27      void *s;
28      size_t len;
29 {
30   long int dstp = (long int) s;
31   const op_t zero = 0;
32
33   if (len >= 8)
34     {
35       size_t xlen;
36
37       /* There are at least some bytes to zero.  No need to test
38          for LEN == 0 in this alignment loop.  */
39       while (dstp % OPSIZ != 0)
40         {
41           ((byte *) dstp)[0] = 0;
42           dstp += 1;
43           len -= 1;
44         }
45
46       /* Write 8 op_t per iteration until less than 8 op_t remain.  */
47       xlen = len / (OPSIZ * 8);
48       while (xlen != 0)
49         {
50           ((op_t *) dstp)[0] = zero;
51           ((op_t *) dstp)[1] = zero;
52           ((op_t *) dstp)[2] = zero;
53           ((op_t *) dstp)[3] = zero;
54           ((op_t *) dstp)[4] = zero;
55           ((op_t *) dstp)[5] = zero;
56           ((op_t *) dstp)[6] = zero;
57           ((op_t *) dstp)[7] = zero;
58           dstp += 8 * OPSIZ;
59           xlen -= 1;
60         }
61       len %= OPSIZ * 8;
62
63       /* Write 1 op_t per iteration until less than op_t remain.  */
64       xlen = len / OPSIZ;
65       while (xlen != 0)
66         {
67           ((op_t *) dstp)[0] = zero;
68           dstp += OPSIZ;
69           xlen -= 1;
70         }
71       len %= OPSIZ;
72     }
73
74   /* Write the last few bytes.  */
75   while (len != 0)
76     {
77       ((byte *) dstp)[0] = 0;
78       dstp += 1;
79       len -= 1;
80     }
81 }
82 weak_alias (__bzero, bzero)