Author: mjg
Date: Wed Dec 19 21:03:17 2018
New Revision: 342238
URL: https://svnweb.freebsd.org/changeset/base/342238

Log:
  MFC r341364
  
  amd64: align target memmove buffer to 16 bytes before using rep movs

Modified:
  stable/12/lib/libc/amd64/string/memmove.S
  stable/12/sys/amd64/amd64/support.S
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/lib/libc/amd64/string/memmove.S
==============================================================================
--- stable/12/lib/libc/amd64/string/memmove.S   Wed Dec 19 20:29:52 2018        
(r342237)
+++ stable/12/lib/libc/amd64/string/memmove.S   Wed Dec 19 21:03:17 2018        
(r342238)
@@ -130,6 +130,8 @@ __FBSDID("$FreeBSD$");
 
        ALIGN_TEXT
 1256:
+       testb   $15,%dil
+       jnz     100f
 .if \erms == 1
        rep
        movsb
@@ -140,6 +142,34 @@ __FBSDID("$FreeBSD$");
        movq    %rdx,%rcx
        andb    $7,%cl                         /* any bytes left? */
        jne     1004b
+.endif
+       \end
+       ret
+100:
+       movq    (%rsi),%r8
+       movq    8(%rsi),%r9
+       movq    %rdi,%r10
+       movq    %rdi,%rcx
+       andq    $15,%rcx
+       leaq    -16(%rdx,%rcx),%rdx
+       neg     %rcx
+       leaq    16(%rdi,%rcx),%rdi
+       leaq    16(%rsi,%rcx),%rsi
+       movq    %rdx,%rcx
+.if \erms == 1
+       rep
+       movsb
+       movq    %r8,(%r10)
+       movq    %r9,8(%r10)
+.else
+       shrq    $3,%rcx                         /* copy by 64-bit words */
+       rep
+       movsq
+       movq    %r8,(%r10)
+       movq    %r9,8(%r10)
+       movq    %rdx,%rcx
+       andl    $7,%ecx                         /* any bytes left? */
+       jne     100408b
 .endif
        \end
        ret

Modified: stable/12/sys/amd64/amd64/support.S
==============================================================================
--- stable/12/sys/amd64/amd64/support.S Wed Dec 19 20:29:52 2018        
(r342237)
+++ stable/12/sys/amd64/amd64/support.S Wed Dec 19 21:03:17 2018        
(r342238)
@@ -293,6 +293,8 @@ END(memcmp)
 
        ALIGN_TEXT
 1256:
+       testb   $15,%dil
+       jnz     100f
 .if \erms == 1
        rep
        movsb
@@ -303,6 +305,34 @@ END(memcmp)
        movq    %rdx,%rcx
        andb    $7,%cl                         /* any bytes left? */
        jne     1004b
+.endif
+       \end
+       ret
+100:
+       movq    (%rsi),%r8
+       movq    8(%rsi),%r9
+       movq    %rdi,%r10
+       movq    %rdi,%rcx
+       andq    $15,%rcx
+       leaq    -16(%rdx,%rcx),%rdx
+       neg     %rcx
+       leaq    16(%rdi,%rcx),%rdi
+       leaq    16(%rsi,%rcx),%rsi
+       movq    %rdx,%rcx
+.if \erms == 1
+       rep
+       movsb
+       movq    %r8,(%r10)
+       movq    %r9,8(%r10)
+.else
+       shrq    $3,%rcx                         /* copy by 64-bit words */
+       rep
+       movsq
+       movq    %r8,(%r10)
+       movq    %r9,8(%r10)
+       movq    %rdx,%rcx
+       andl    $7,%ecx                         /* any bytes left? */
+       jne     100408b
 .endif
        \end
        ret
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to