diff options
author | Ingo Molnar <mingo@kernel.org> | 2012-03-30 08:47:19 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-03-30 08:50:06 +0200 |
commit | 186e54cbe1145f4d11e32fe10e7e20a11f1b27dd (patch) | |
tree | 9b6cf3667a3ea90e0cec0ea7119688ba76c55a71 /lib/string.c | |
parent | 99dd5497e5be4fe4194cad181d45fd6569a930db (diff) | |
parent | 4bde23f8751f388867766b0a62ed1ef8b7e01561 (diff) |
Merge branch 'linus' into x86/urgent
Merge reason: Needed for include file dependencies.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'lib/string.c')
-rw-r--r-- | lib/string.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/string.c b/lib/string.c index dc4a86341f9..e5878de4f10 100644 --- a/lib/string.c +++ b/lib/string.c @@ -22,7 +22,10 @@ #include <linux/types.h> #include <linux/string.h> #include <linux/ctype.h> -#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/export.h> +#include <linux/bug.h> +#include <linux/errno.h> #ifndef __HAVE_ARCH_STRNICMP /** @@ -785,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; |