Branch data Line data Source code
1 : : /******************************************************************************
2 : : * Copyright (c) 2004, 2008 IBM Corporation
3 : : * All rights reserved.
4 : : * This program and the accompanying materials
5 : : * are made available under the terms of the BSD License
6 : : * which accompanies this distribution, and is available at
7 : : * http://www.opensource.org/licenses/bsd-license.php
8 : : *
9 : : * Contributors:
10 : : * IBM Corporation - initial implementation
11 : : *****************************************************************************/
12 : :
13 : : #define CACHE_LINE_SIZE 128
14 : :
15 : : #include <stddef.h>
16 : :
17 : : void *memset(void *dest, int c, size_t size);
18 : 20 : void *memset(void *dest, int c, size_t size)
19 : : {
20 : 20 : unsigned char *d = (unsigned char *)dest;
21 : 20 : unsigned long big_c = 0;
22 : :
23 : : #if defined(__powerpc__) || defined(__powerpc64__)
24 : : if (size > CACHE_LINE_SIZE && c==0) {
25 : : while ((unsigned long long)d % CACHE_LINE_SIZE) {
26 : : *d++ = (unsigned char)c;
27 : : size--;
28 : : }
29 : : while (size >= CACHE_LINE_SIZE) {
30 : : asm volatile ("dcbz 0,%0\n" : : "r"(d) : "memory");
31 : : d+= CACHE_LINE_SIZE;
32 : : size-= CACHE_LINE_SIZE;
33 : : }
34 : : }
35 : : #endif
36 : :
37 : 20 : if (c) {
38 : 5 : big_c = c;
39 : 5 : big_c |= (big_c << 8) | big_c;
40 : 5 : big_c |= (big_c << 16) | big_c;
41 : 5 : big_c |= (big_c << 32) | big_c;
42 : : }
43 : 815 : while (size >= 8 && c == 0) {
44 : 795 : *((unsigned long *)d) = big_c;
45 : 795 : d+=8;
46 : 795 : size-=8;
47 : : }
48 : :
49 : 555 : while (size-- > 0) {
50 : 535 : *d++ = (unsigned char)c;
51 : : }
52 : :
53 : 20 : return dest;
54 : : }
|