This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug string/22353] sysdeps/i386/i586/strcpy.S isn't maintainable
- From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sourceware dot org
- Date: Mon, 30 Oct 2017 17:03:17 +0000
- Subject: [Bug string/22353] sysdeps/i386/i586/strcpy.S isn't maintainable
- Auto-submitted: auto-generated
- References: <bug-22353-131@http.sourceware.org/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=22353
--- Comment #4 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via c5cc45148c89cc5c57d1946348dd242d4db5c5f5 (commit)
from ce12269fac8cb873df1a8785e4a6cde870855590 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=c5cc45148c89cc5c57d1946348dd242d4db5c5f5
commit c5cc45148c89cc5c57d1946348dd242d4db5c5f5
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Mon Oct 30 10:02:16 2017 -0700
i586: Use conditional branches in strcpy.S [BZ #22353]
i586 strcpy.S used a clever trick with LEA to implement jump table:
/* ECX has the last 2 bits of the address of source - 1. */
andl $3, %ecx
call 2f
2: popl %edx
/* 0xb is the distance between 2: and 1:. */
leal 0xb(%edx,%ecx,8), %ecx
jmp *%ecx
.align 8
1: /* ECX == 0 */
orb (%esi), %al
jz L(end)
stosb
xorl %eax, %eax
incl %esi
/* ECX == 1 */
orb (%esi), %al
jz L(end)
stosb
xorl %eax, %eax
incl %esi
/* ECX == 2 */
orb (%esi), %al
jz L(end)
stosb
xorl %eax, %eax
incl %esi
/* ECX == 3 */
L(1): movl (%esi), %ecx
leal 4(%esi),%esi
This fails if there are instruction length changes before L(1):. This
patch replaces it with conditional branches:
cmpb $2, %cl
je L(Src2)
ja L(Src3)
cmpb $1, %cl
je L(Src1)
L(Src0):
which have similar performance and work with any instruction lengths.
Tested on i586 and i686 with and without --disable-multi-arch.
[BZ #22353]
* sysdeps/i386/i586/strcpy.S (STRCPY): Use conditional branches.
(1): Renamed to ...
(L(Src0)): This.
(L(Src1)): New.
(L(Src2)): Likewise.
(L(1)): Renamed to ...
(L(Src3)): This.
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 11 +++++++++++
sysdeps/i386/i586/strcpy.S | 28 +++++++++++-----------------
2 files changed, 22 insertions(+), 17 deletions(-)
--
You are receiving this mail because:
You are on the CC list for the bug.