This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug string/22353] sysdeps/i386/i586/strcpy.S isn't maintainable


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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]