diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2015-02-10 18:30:57 +0100 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-02-10 18:54:27 -0500 |
commit | 74e334dcd177b585c64ddafa732a3dc9e3f6b5ec (patch) | |
tree | d2e80f3871e4eacac8ea211e0f80f984ee5c68da | |
parent | bf2071eda32528ee8b0bb89544152646684a2cf3 (diff) | |
download | musl-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.s | 2 |
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) |