Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* memcopy.h -- definitions for memory copy functions. i386 version. |
---|---|
2 | Copyright (C) 1991-2024 Free Software Foundation, Inc. |
3 | This file is part of the GNU C Library. |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, see |
17 | <https://www.gnu.org/licenses/>. */ |
18 | |
19 | #include <sysdeps/generic/memcopy.h> |
20 | |
21 | #undef BYTE_COPY_FWD |
22 | #define BYTE_COPY_FWD(dst_bp, src_bp, nbytes) \ |
23 | do { \ |
24 | int __d0; \ |
25 | asm volatile(/* Clear the direction flag, so copying goes forward. */ \ |
26 | "cld\n" \ |
27 | /* Copy bytes. */ \ |
28 | "rep\n" \ |
29 | "movsb" : \ |
30 | "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : \ |
31 | "0" (dst_bp), "1" (src_bp), "2" (nbytes) : \ |
32 | "memory"); \ |
33 | } while (0) |
34 | |
35 | #undef BYTE_COPY_BWD |
36 | #define BYTE_COPY_BWD(dst_ep, src_ep, nbytes) \ |
37 | do \ |
38 | { \ |
39 | int __d0; \ |
40 | asm volatile(/* Set the direction flag, so copying goes backwards. */ \ |
41 | "std\n" \ |
42 | /* Copy bytes. */ \ |
43 | "rep\n" \ |
44 | "movsb\n" \ |
45 | /* Clear the dir flag. Convention says it should be 0. */ \ |
46 | "cld" : \ |
47 | "=D" (dst_ep), "=S" (src_ep), "=c" (__d0) : \ |
48 | "0" (dst_ep - 1), "1" (src_ep - 1), "2" (nbytes) : \ |
49 | "memory"); \ |
50 | dst_ep += 1; \ |
51 | src_ep += 1; \ |
52 | } while (0) |
53 | |
54 | #undef WORD_COPY_FWD |
55 | #define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ |
56 | do \ |
57 | { \ |
58 | int __d0; \ |
59 | asm volatile(/* Clear the direction flag, so copying goes forward. */ \ |
60 | "cld\n" \ |
61 | /* Copy longwords. */ \ |
62 | "rep\n" \ |
63 | "movsl" : \ |
64 | "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : \ |
65 | "0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) : \ |
66 | "memory"); \ |
67 | (nbytes_left) = (nbytes) % 4; \ |
68 | } while (0) |
69 | |
70 | #undef WORD_COPY_BWD |
71 | #define WORD_COPY_BWD(dst_ep, src_ep, nbytes_left, nbytes) \ |
72 | do \ |
73 | { \ |
74 | int __d0; \ |
75 | asm volatile(/* Set the direction flag, so copying goes backwards. */ \ |
76 | "std\n" \ |
77 | /* Copy longwords. */ \ |
78 | "rep\n" \ |
79 | "movsl\n" \ |
80 | /* Clear the dir flag. Convention says it should be 0. */ \ |
81 | "cld" : \ |
82 | "=D" (dst_ep), "=S" (src_ep), "=c" (__d0) : \ |
83 | "0" (dst_ep - 4), "1" (src_ep - 4), "2" ((nbytes) / 4) : \ |
84 | "memory"); \ |
85 | dst_ep += 4; \ |
86 | src_ep += 4; \ |
87 | (nbytes_left) = (nbytes) % 4; \ |
88 | } while (0) |
89 |
Warning: This file is not a C or C++ file. It does not have highlighting.