aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@tilera.com>2014-09-15 20:02:50 -0400
committerChris Metcalf <cmetcalf@tilera.com>2014-10-06 11:18:41 -0400
commit1c4c1a6f4d0e8ffab24419d136fbfe698a201d24 (patch)
tree5c5be108661211cd2e6fd4f41f399bf2d03f2429
parent99d86ea324820ec7b7755377182922a6233e25fb (diff)
downloadtermbaud-1c4c1a6f4d0e8ffab24419d136fbfe698a201d24.tar.gz
termbaud-1c4c1a6f4d0e8ffab24419d136fbfe698a201d24.tar.xz
termbaud-1c4c1a6f4d0e8ffab24419d136fbfe698a201d24.zip
tilegx: optimize string copy_byte() internal function
We can use one "shufflebytes" instruction instead of 3 "bfins" instructions to optimize the string functions.
-rw-r--r--ChangeLog4
-rw-r--r--sysdeps/tile/tilegx/string-endian.h11
2 files changed, 9 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index ad73cf473dc..ce5ec8f115e 100644
--- 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.
diff --git a/sysdeps/tile/tilegx/string-endian.h b/sysdeps/tile/tilegx/string-endian.h
index 0c4d51766d7..47333891e07 100644
--- a/sysdeps/tile/tilegx/string-endian.h
+++ b/sysdeps/tile/tilegx/string-endian.h
@@ -36,12 +36,11 @@
#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);
}