1/* strcpy/stpcpy implementation for i586.
2 Copyright (C) 1997-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 <sysdep.h>
20#include "asm-syntax.h"
21
22#define PARMS 4+12 /* space for 3 saved regs */
23#define RTN PARMS
24#define DEST RTN
25#define SRC DEST+4
26
27#ifndef USE_AS_STPCPY
28# define STRCPY strcpy
29#endif
30
31#define magic 0xfefefeff
32
33 .text
34ENTRY (STRCPY)
35
36 pushl %edi
37 cfi_adjust_cfa_offset (4)
38 pushl %esi
39 cfi_adjust_cfa_offset (4)
40 pushl %ebx
41 cfi_adjust_cfa_offset (4)
42
43 movl DEST(%esp), %edi
44 cfi_rel_offset (edi, 8)
45 movl SRC(%esp), %esi
46 cfi_rel_offset (esi, 4)
47
48 xorl %eax, %eax
49 leal -1(%esi), %ecx
50
51 movl $magic, %ebx
52 cfi_rel_offset (ebx, 0)
53 andl $3, %ecx
54
55 cmpb $2, %cl
56 je L(Src2)
57 ja L(Src3)
58 cmpb $1, %cl
59 je L(Src1)
60
61L(Src0):
62 orb (%esi), %al
63 jz L(end)
64 stosb
65 xorl %eax, %eax
66 incl %esi
67
68L(Src1):
69 orb (%esi), %al
70 jz L(end)
71 stosb
72 xorl %eax, %eax
73 incl %esi
74
75L(Src2):
76 orb (%esi), %al
77 jz L(end)
78 stosb
79 xorl %eax, %eax
80 incl %esi
81
82L(Src3):
83 movl (%esi), %ecx
84 leal 4(%esi),%esi
85
86 subl %ecx, %eax
87 addl %ebx, %ecx
88
89 decl %eax
90 jnc L(3)
91
92 movl %ecx, %edx
93 xorl %ecx, %eax
94
95 subl %ebx, %edx
96 andl $~magic, %eax
97
98 jne L(4)
99
100 movl %edx, (%edi)
101 leal 4(%edi),%edi
102
103 jmp L(Src3)
104
105L(3): movl %ecx, %edx
106
107 subl %ebx, %edx
108
109L(4): movb %dl, (%edi)
110 testb %dl, %dl
111
112 movl %edx, %eax
113 jz L(end2)
114
115 shrl $16, %eax
116 movb %dh, 1(%edi)
117#ifdef USE_AS_STPCPY
118 addl $1, %edi
119#endif
120
121 cmpb $0, %dh
122 jz L(end2)
123
124#ifdef USE_AS_STPCPY
125 movb %al, 1(%edi)
126 addl $1, %edi
127
128 cmpb $0, %al
129 jz L(end2)
130
131 addl $1, %edi
132#else
133 movb %al, 2(%edi)
134 testb %al, %al
135
136 leal 3(%edi), %edi
137 jz L(end2)
138#endif
139
140L(end): movb %ah, (%edi)
141
142L(end2):
143#ifdef USE_AS_STPCPY
144 movl %edi, %eax
145#else
146 movl DEST(%esp), %eax
147#endif
148 popl %ebx
149 cfi_adjust_cfa_offset (-4)
150 cfi_restore (ebx)
151 popl %esi
152 cfi_adjust_cfa_offset (-4)
153 cfi_restore (esi)
154 popl %edi
155 cfi_adjust_cfa_offset (-4)
156 cfi_restore (edi)
157
158 ret
159END (STRCPY)
160#ifndef USE_AS_STPCPY
161libc_hidden_builtin_def (strcpy)
162#endif
163

source code of glibc/sysdeps/i386/i586/strcpy.S