X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Fstring.c;h=e5878de4f1013ddbdd3db07d1fca2bcc3a692a7c;hb=623e3db9f9b7d6e7b2a99180f9cf0825c936ab7a;hp=0573a20df9a6d85c7d559c608ea42df8140163a8;hpb=50af5ead3b44ccf8bd2b4d2a50c1b610f557c480;p=platform%2Fadaptation%2Frenesas_rcar%2Frenesas_kernel.git diff --git a/lib/string.c b/lib/string.c index 0573a20..e5878de 100644 --- a/lib/string.c +++ b/lib/string.c @@ -22,8 +22,10 @@ #include #include #include +#include +#include #include -#include +#include #ifndef __HAVE_ARCH_STRNICMP /** @@ -786,12 +788,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;