70
by Michael Hope
Added the C only routines from GLIBC 2.16+20120607~git24a6dbe |
1 |
/* Copy memory to memory until the specified number of bytes
|
2 |
has been copied. Overlap is NOT handled correctly.
|
|
3 |
Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
|
|
4 |
This file is part of the GNU C Library.
|
|
5 |
Contributed by Torbjorn Granlund (tege@sics.se).
|
|
6 |
||
7 |
The GNU C Library is free software; you can redistribute it and/or
|
|
8 |
modify it under the terms of the GNU Lesser General Public
|
|
9 |
License as published by the Free Software Foundation; either
|
|
10 |
version 2.1 of the License, or (at your option) any later version.
|
|
11 |
||
12 |
The GNU C Library is distributed in the hope that it will be useful,
|
|
13 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
15 |
Lesser General Public License for more details.
|
|
16 |
||
17 |
You should have received a copy of the GNU Lesser General Public
|
|
18 |
License along with the GNU C Library; if not, see
|
|
19 |
<http://www.gnu.org/licenses/>. */
|
|
20 |
||
21 |
#include <string.h> |
|
22 |
#include "memcopy.h" |
|
23 |
#include "pagecopy.h" |
|
24 |
||
25 |
#undef memcpy
|
|
26 |
||
27 |
void * |
|
28 |
memcpy (dstpp, srcpp, len) |
|
29 |
void *dstpp; |
|
30 |
const void *srcpp; |
|
31 |
size_t len; |
|
32 |
{
|
|
33 |
unsigned long int dstp = (long int) dstpp; |
|
34 |
unsigned long int srcp = (long int) srcpp; |
|
35 |
||
36 |
/* Copy from the beginning to the end. */
|
|
37 |
||
38 |
/* If there not too few bytes to copy, use word copy. */
|
|
39 |
if (len >= OP_T_THRES) |
|
40 |
{
|
|
41 |
/* Copy just a few bytes to make DSTP aligned. */
|
|
42 |
len -= (-dstp) % OPSIZ; |
|
43 |
BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); |
|
44 |
||
45 |
/* Copy whole pages from SRCP to DSTP by virtual address manipulation,
|
|
46 |
as much as possible. */
|
|
47 |
||
48 |
PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len); |
|
49 |
||
50 |
/* Copy from SRCP to DSTP taking advantage of the known alignment of
|
|
51 |
DSTP. Number of bytes remaining is put in the third argument,
|
|
52 |
i.e. in LEN. This number may vary from machine to machine. */
|
|
53 |
||
54 |
WORD_COPY_FWD (dstp, srcp, len, len); |
|
55 |
||
56 |
/* Fall out and copy the tail. */
|
|
57 |
}
|
|
58 |
||
59 |
/* There are just a few bytes to copy. Use byte memory operations. */
|
|
60 |
BYTE_COPY_FWD (dstp, srcp, len); |
|
61 |
||
62 |
return dstpp; |
|
63 |
}
|