diff options
author | Xuelei Zhang <zhangxuelei4@huawei.com> | 2019-12-19 15:26:33 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-12-19 16:31:04 -0300 |
commit | 525de033a9d19bc79ce353745d14927a793dd4e8 (patch) | |
tree | 8c12f0bd8573525387a8ecbdd447f0347c7894c3 /sysdeps/aarch64/multiarch/memset.c | |
parent | c2150769d015dca1805334af7743829f1e4c0b6a (diff) | |
download | glibc-525de033a9d19bc79ce353745d14927a793dd4e8.tar.gz glibc-525de033a9d19bc79ce353745d14927a793dd4e8.tar.xz glibc-525de033a9d19bc79ce353745d14927a793dd4e8.zip |
aarch64: Optimized memset for Kunpeng processor.
Due to the branch prediction issue of Kunpeng processor, we found memset_generic has poor performance on middle sizes setting, and so we reconstructed the logic, expanded the loop by 4 times in set_long to solve the problem, even when setting below 1K sizes have benefit. Another change is that DZ_ZVA seems no work when setting zero, so we discarded it and used set_long to set zero instead. Fewer branches and predictions also make the zero case have slightly improvement. Checked on aarch64-linux-gnu. Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
Diffstat (limited to 'sysdeps/aarch64/multiarch/memset.c')
-rw-r--r-- | sysdeps/aarch64/multiarch/memset.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sysdeps/aarch64/multiarch/memset.c b/sysdeps/aarch64/multiarch/memset.c index e9cdd385f2..4cc34b9b99 100644 --- a/sysdeps/aarch64/multiarch/memset.c +++ b/sysdeps/aarch64/multiarch/memset.c @@ -30,10 +30,13 @@ extern __typeof (__redirect_memset) __libc_memset; extern __typeof (__redirect_memset) __memset_falkor attribute_hidden; extern __typeof (__redirect_memset) __memset_emag attribute_hidden; +extern __typeof (__redirect_memset) __memset_kunpeng attribute_hidden; extern __typeof (__redirect_memset) __memset_generic attribute_hidden; libc_ifunc (__libc_memset, - ((IS_FALKOR (midr) || IS_PHECDA (midr)) && zva_size == 64 + IS_KUNPENG (midr) + ?__memset_kunpeng + : ((IS_FALKOR (midr) || IS_PHECDA (midr)) && zva_size == 64 ? __memset_falkor : (IS_EMAG (midr) && zva_size == 64 ? __memset_emag |