tilegx: optimize string copy_byte() internal function
authorChris Metcalf <cmetcalf@tilera.com>
Tue, 16 Sep 2014 00:02:50 +0000 (20:02 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Mon, 6 Oct 2014 15:18:41 +0000 (11:18 -0400)
We can use one "shufflebytes" instruction instead of 3 "bfins"
instructions to optimize the string functions.

ChangeLog
sysdeps/tile/tilegx/string-endian.h

index ad73cf4..ce5ec8f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-10-02  Chris Metcalf  <cmetcalf@tilera.com>
+
+       * sysdeps/tile/tilegx/string-endian.h (copy_byte): Optimize.
+
 2014-10-06  Arjun Shankar  <arjun.is@lostca.se>
 
        * nptl/tst-setuid3.c: Write errors to stdout.
index 0c4d517..4733389 100644 (file)
 #define REVCZ(x) __insn_ctz(x)
 #endif
 
-/* Create eight copies of the byte in a uint64_t. */
+/* Create eight copies of the byte in a uint64_t.  Byte Shuffle uses
+   the bytes of srcB as the index into the dest vector to select a
+   byte.  With all indices of zero, the first byte is copied into all
+   the other bytes.  */
 static inline uint64_t copy_byte(uint8_t byte)
 {
-  uint64_t word = byte;
-  word = __insn_bfins(word, word, 8, 15);
-  word = __insn_bfins(word, word, 16, 31);
-  word = __insn_bfins(word, word, 32, 63);
-  return word;
+  return __insn_shufflebytes(byte, 0, 0);
 }