about summary refs log tree commit diff
path: root/benchtests/bench-strcpy.c
diff options
context:
space:
mode:
authorRajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>2014-12-31 14:05:00 -0500
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>2014-12-31 14:35:59 -0500
commitf59ad976ed979d22637c5187f6a92fbbd8c191e4 (patch)
treeadf67bb23ce8a0a994d21d95ab4a541217bb9f05 /benchtests/bench-strcpy.c
parent4a3d39994e07105fb1bd20ed71d166f6ebb21974 (diff)
downloadglibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.tar.gz
glibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.tar.xz
glibc-f59ad976ed979d22637c5187f6a92fbbd8c191e4.zip
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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/benchtests/bench-strcpy.c b/benchtests/bench-strcpy.c
index c3ab4cfcf7..e9445f290f 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;
 }