summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2015-02-10 18:30:57 +0100
committerRich Felker <dalias@aerifal.cx>2015-02-10 18:54:27 -0500
commit74e334dcd177b585c64ddafa732a3dc9e3f6b5ec (patch)
treed2e80f3871e4eacac8ea211e0f80f984ee5c68da
parentbf2071eda32528ee8b0bb89544152646684a2cf3 (diff)
downloadmusl-74e334dcd177b585c64ddafa732a3dc9e3f6b5ec.tar.gz
musl-74e334dcd177b585c64ddafa732a3dc9e3f6b5ec.tar.bz2
musl-74e334dcd177b585c64ddafa732a3dc9e3f6b5ec.tar.xz
musl-74e334dcd177b585c64ddafa732a3dc9e3f6b5ec.zip
x86_64/memset: avoid performing final store twice
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>
-rw-r--r--src/string/x86_64/memset.s2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/string/x86_64/memset.s b/src/string/x86_64/memset.s
index 263336b5..3cc8fcf6 100644
--- a/src/string/x86_64/memset.s
+++ b/src/string/x86_64/memset.s
@@ -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)