From 7d43e210cbe210dbce83bef90650638f2064b5b0 Mon Sep 17 00:00:00 2001 From: Akinobu Mita Date: Fri, 23 Mar 2012 15:02:14 -0700 Subject: [PATCH] --- yaml --- r: 295199 b: refs/heads/master c: f43804bf5f9ae1e60077c5f22aee5fdfe4f09837 h: refs/heads/master i: 295197: 56c332607a12891a38f2e2a1a8ba34331d847363 295195: 683787bb8f4386b3d29858f76b067f5bec7e9979 295191: da774bdf988463fbe8de734ea8c3d9551c67279a 295183: db5d1c20f3751ff2eaff495254f3370c54202bf2 295167: d89f356f609853bd36b458030db77ae7bf67cc5b v: v3 --- [refs] | 2 +- trunk/lib/string.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 7e23f8f0800f..2cb187a7e8db 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a403d930c58eb8448f81fa90c125ac36dc8ef89d +refs/heads/master: f43804bf5f9ae1e60077c5f22aee5fdfe4f09837 diff --git a/trunk/lib/string.c b/trunk/lib/string.c index dc4a86341f91..3a03782720c8 100644 --- a/trunk/lib/string.c +++ b/trunk/lib/string.c @@ -785,12 +785,24 @@ void *memchr_inv(const void *start, int c, size_t bytes) if (bytes <= 16) return check_bytes8(start, value, bytes); - value64 = value | value << 8 | value << 16 | value << 24; - value64 = (value64 & 0xffffffff) | value64 << 32; - prefix = 8 - ((unsigned long)start) % 8; + value64 = value; +#if defined(ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64 + value64 *= 0x0101010101010101; +#elif defined(ARCH_HAS_FAST_MULTIPLIER) + value64 *= 0x01010101; + value64 |= value64 << 32; +#else + value64 |= value64 << 8; + value64 |= value64 << 16; + value64 |= value64 << 32; +#endif + prefix = (unsigned long)start % 8; if (prefix) { - u8 *r = check_bytes8(start, value, prefix); + u8 *r; + + prefix = 8 - prefix; + r = check_bytes8(start, value, prefix); if (r) return r; start += prefix;