Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/parisc/lib/memset.c
10817 views
1
/* Copyright (C) 1991, 1997 Free Software Foundation, Inc.
2
This file is part of the GNU C Library.
3
4
The GNU C Library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Lesser General Public
6
License as published by the Free Software Foundation; either
7
version 2.1 of the License, or (at your option) any later version.
8
9
The GNU C Library is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Lesser General Public License for more details.
13
14
You should have received a copy of the GNU Lesser General Public
15
License along with the GNU C Library; if not, write to the Free
16
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17
02111-1307 USA. */
18
19
/* Slight modifications for pa-risc linux - Paul Bame <[email protected]> */
20
21
#include <linux/types.h>
22
#include <asm/string.h>
23
24
#define OPSIZ (BITS_PER_LONG/8)
25
typedef unsigned long op_t;
26
27
void *
28
memset (void *dstpp, int sc, size_t len)
29
{
30
unsigned int c = sc;
31
long int dstp = (long int) dstpp;
32
33
if (len >= 8)
34
{
35
size_t xlen;
36
op_t cccc;
37
38
cccc = (unsigned char) c;
39
cccc |= cccc << 8;
40
cccc |= cccc << 16;
41
if (OPSIZ > 4)
42
/* Do the shift in two steps to avoid warning if long has 32 bits. */
43
cccc |= (cccc << 16) << 16;
44
45
/* There are at least some bytes to set.
46
No need to test for LEN == 0 in this alignment loop. */
47
while (dstp % OPSIZ != 0)
48
{
49
((unsigned char *) dstp)[0] = c;
50
dstp += 1;
51
len -= 1;
52
}
53
54
/* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
55
xlen = len / (OPSIZ * 8);
56
while (xlen > 0)
57
{
58
((op_t *) dstp)[0] = cccc;
59
((op_t *) dstp)[1] = cccc;
60
((op_t *) dstp)[2] = cccc;
61
((op_t *) dstp)[3] = cccc;
62
((op_t *) dstp)[4] = cccc;
63
((op_t *) dstp)[5] = cccc;
64
((op_t *) dstp)[6] = cccc;
65
((op_t *) dstp)[7] = cccc;
66
dstp += 8 * OPSIZ;
67
xlen -= 1;
68
}
69
len %= OPSIZ * 8;
70
71
/* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
72
xlen = len / OPSIZ;
73
while (xlen > 0)
74
{
75
((op_t *) dstp)[0] = cccc;
76
dstp += OPSIZ;
77
xlen -= 1;
78
}
79
len %= OPSIZ;
80
}
81
82
/* Write the last few bytes. */
83
while (len > 0)
84
{
85
((unsigned char *) dstp)[0] = c;
86
dstp += 1;
87
len -= 1;
88
}
89
90
return dstpp;
91
}
92
93