x86_64/memset: avoid performing final store twice
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 10 Feb 2015 17:30:57 +0000 (18:30 +0100)
committerRich Felker <dalias@aerifal.cx>
Tue, 10 Feb 2015 23:54:27 +0000 (18:54 -0500)
The code does a potentially misaligned 8-byte store to fill the tail
of the buffer. Then it fills the initial part of the buffer
which is a multiple of 8 bytes.
Therefore, if size is divisible by 8, we were storing last word twice.

This patch decrements byte count before dividing it by 8,
making one less store in "size is divisible by 8" case,
and not changing anything in all other cases.
All at the cost of replacing one MOV insn with LEA insn.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
src/string/x86_64/memset.s

index 263336b56c7700431d23a4048ac71f9d8ec69208..3cc8fcf6b718295f4c977da2d7957d7d53d9c421 100644 (file)
@@ -9,7 +9,7 @@ memset:
        cmp $16,%rdx
        jb 1f
 
-       mov %rdx,%rcx
+       lea -1(%rdx),%rcx
        mov %rdi,%r8
        shr $3,%rcx
        mov %rax,-8(%rdi,%rdx)