diff options
author | Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> | 2014-12-31 14:05:00 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2014-12-31 14:35:59 -0500 |
commit | f59ad976ed979d22637c5187f6a92fbbd8c191e4 (patch) | |
tree | adf67bb23ce8a0a994d21d95ab4a541217bb9f05 /benchtests/bench-strcpy.c | |
parent | 4a3d39994e07105fb1bd20ed71d166f6ebb21974 (diff) | |
download | glibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.zip glibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.tar.gz glibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.tar.bz2 |
powerpc: POWER7 strcpy optimization for unaligned strings
This patch optimizes strcpy for ppc64/power7 for unaligned source or
destination address. The source or destination address is aligned
to doubleword and data is shifted based on the alignment and
added with the previous loaded data to be written as a doubleword.
For each load, cmpb instruction is used for faster null check.
The word aligned optimization is also removed, since the new unaligned
code path shows better results handling word-aligned strings.
More combination of unaligned inputs is also added in benchtest
to measure the improvement.The new optimization shows 2 to 80% of
performance improvement for longer string though it does not show
big difference on string size less than 16 due to additional checks.
Diffstat (limited to 'benchtests/bench-strcpy.c')
-rw-r--r-- | benchtests/bench-strcpy.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/benchtests/bench-strcpy.c b/benchtests/bench-strcpy.c index c3ab4cf..e9445f2 100644 --- a/benchtests/bench-strcpy.c +++ b/benchtests/bench-strcpy.c @@ -171,6 +171,22 @@ test_main (void) do_test (i, i, 8 << i, BIG_CHAR); } + for (i = 16; i <= 512; i+=4) + { + do_test (0, 4, i, SMALL_CHAR); + do_test (4, 0, i, BIG_CHAR); + do_test (4, 4, i, SMALL_CHAR); + do_test (2, 2, i, BIG_CHAR); + do_test (2, 6, i, SMALL_CHAR); + do_test (6, 2, i, BIG_CHAR); + do_test (1, 7, i, SMALL_CHAR); + do_test (7, 1, i, BIG_CHAR); + do_test (3, 4, i, SMALL_CHAR); + do_test (4, 3, i, BIG_CHAR); + do_test (5, 7, i, SMALL_CHAR); + do_test (7, 5, i, SMALL_CHAR); + } + return ret; } |