~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/skiboot/libc/string/memset.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
#include "string.h"
 
14
 
 
15
#define CACHE_LINE_SIZE 128
 
16
 
 
17
void *
 
18
memset(void *dest, int c, size_t size)
 
19
{
 
20
        unsigned char *d = (unsigned char *)dest;
 
21
 
 
22
#if defined(__powerpc__) || defined(__powerpc64__)
 
23
        if (size > CACHE_LINE_SIZE && c==0) {
 
24
                while ((unsigned long long)d % CACHE_LINE_SIZE) {
 
25
                        *d++ = (unsigned char)c;
 
26
                        size--;
 
27
                }
 
28
                while (size >= CACHE_LINE_SIZE) {
 
29
                        asm volatile ("dcbz 0,%0\n" : : "r"(d) : "memory");
 
30
                        d+= CACHE_LINE_SIZE;
 
31
                        size-= CACHE_LINE_SIZE;
 
32
                }
 
33
        }
 
34
#endif
 
35
 
 
36
        while (size >= 8 && c == 0) {
 
37
                *((unsigned long long*)d) = 0ULL;
 
38
                d+=8;
 
39
                size-=8;
 
40
        }
 
41
 
 
42
        while (size-- > 0) {
 
43
                *d++ = (unsigned char)c;
 
44
        }
 
45
 
 
46
        return dest;
 
47
}