]>
Commit | Line | Data |
---|---|---|
ebbad4cc UD |
1 | /* bzero -- set a block of memory to zero. For Intel 80x86, x>=3. |
2 | This file is part of the GNU C Library. | |
b168057a | 3 | Copyright (C) 1991-2015 Free Software Foundation, Inc. |
28f540f4 RM |
4 | Contributed by Torbjorn Granlund (tege@sics.se). |
5 | ||
ebbad4cc | 6 | The GNU C Library is free software; you can redistribute it and/or |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
28f540f4 | 10 | |
ebbad4cc UD |
11 | The GNU C Library is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
28f540f4 | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
28f540f4 | 19 | |
28f540f4 RM |
20 | #include <string.h> |
21 | #include <memcopy.h> | |
22 | ||
23 | #undef bzero | |
55bdfe27 | 24 | #undef __bzero |
28f540f4 RM |
25 | |
26 | #ifdef __GNUC__ | |
27 | ||
28 | void | |
61eb22d3 | 29 | __bzero (dstpp, len) |
ebbad4cc UD |
30 | void *dstpp; |
31 | size_t len; | |
28f540f4 RM |
32 | { |
33 | /* N.B.: This code is almost verbatim from memset.c. */ | |
6dbb7062 | 34 | int d0; |
28f540f4 RM |
35 | unsigned long int dstp = (unsigned long int) dstpp; |
36 | ||
37 | /* This explicit register allocation | |
38 | improves code very much indeed. */ | |
ebbad4cc | 39 | register op_t x asm ("ax"); |
28f540f4 RM |
40 | |
41 | x = 0; | |
42 | ||
43 | /* Clear the direction flag, so filling will move forward. */ | |
ebbad4cc | 44 | asm volatile ("cld"); |
28f540f4 RM |
45 | |
46 | /* This threshold value is optimal. */ | |
47 | if (len >= 12) | |
48 | { | |
49 | /* Adjust LEN for the bytes handled in the first loop. */ | |
50 | len -= (-dstp) % OPSIZ; | |
51 | ||
52 | /* There are at least some bytes to set. | |
53 | No need to test for LEN == 0 in this alignment loop. */ | |
54 | ||
55 | /* Fill bytes until DSTP is aligned on a longword boundary. */ | |
ebbad4cc UD |
56 | asm volatile ("rep\n" |
57 | "stosb" /* %0, %2, %3 */ : | |
6dbb7062 UD |
58 | "=D" (dstp), "=c" (d0) : |
59 | "0" (dstp), "1" ((-dstp) % OPSIZ), "a" (x) : | |
60 | "memory"); | |
28f540f4 RM |
61 | |
62 | /* Fill longwords. */ | |
ebbad4cc UD |
63 | asm volatile ("rep\n" |
64 | "stosl" /* %0, %2, %3 */ : | |
6dbb7062 UD |
65 | "=D" (dstp), "=c" (d0) : |
66 | "0" (dstp), "1" (len / OPSIZ), "a" (x) : | |
67 | "memory"); | |
28f540f4 RM |
68 | len %= OPSIZ; |
69 | } | |
70 | ||
71 | /* Write the last few bytes. */ | |
ebbad4cc UD |
72 | asm volatile ("rep\n" |
73 | "stosb" /* %0, %2, %3 */ : | |
6dbb7062 | 74 | "=D" (dstp), "=c" (d0) : |
ebbad4cc | 75 | "0" (dstp), "c" (len), "a" (x) : |
6dbb7062 | 76 | "memory"); |
28f540f4 | 77 | } |
61eb22d3 | 78 | weak_alias (__bzero, bzero) |
28f540f4 RM |
79 | |
80 | #else | |
2826ac7e | 81 | #include <string/bzero.c> |
28f540f4 | 82 | #endif |