FROMLIST: lib/string.c: Add a macro for memchr_inv()
We add a macro MEMCHR_MASK_GEN() so that both memchr_inv() and memchr() can use it to generate a 8 bytes mask. Signed-off-by: Yu-Jen Chang <arthurchang09@gmail.com> Signed-off-by: Ching-Chun (Jim) Huang <jserv@ccns.ncku.edu.tw> Change-Id: I2197b6455d321600a00043986f7c3a627e027d44
This commit is contained in:
parent
3cd48bb0af
commit
5d809acea5
34
lib/string.c
34
lib/string.c
@ -1020,6 +1020,29 @@ char *strnstr(const char *s1, const char *s2, size_t len)
|
|||||||
EXPORT_SYMBOL(strnstr);
|
EXPORT_SYMBOL(strnstr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
|
||||||
|
|
||||||
|
#define MEMCHR_MASK_GEN(mask) (mask *= 0x0101010101010101ULL)
|
||||||
|
|
||||||
|
#elif defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER)
|
||||||
|
|
||||||
|
#define MEMCHR_MASK_GEN(mask) \
|
||||||
|
do { \
|
||||||
|
mask *= 0x01010101; \
|
||||||
|
mask |= mask << 32; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define MEMCHR_MASK_GEN(mask) \
|
||||||
|
do { \
|
||||||
|
mask |= mask << 8; \
|
||||||
|
mask |= mask << 16; \
|
||||||
|
mask |= mask << 32; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_MEMCHR
|
#ifndef __HAVE_ARCH_MEMCHR
|
||||||
/**
|
/**
|
||||||
* memchr - Find a character in an area of memory.
|
* memchr - Find a character in an area of memory.
|
||||||
@ -1073,16 +1096,7 @@ void *memchr_inv(const void *start, int c, size_t bytes)
|
|||||||
return check_bytes8(start, value, bytes);
|
return check_bytes8(start, value, bytes);
|
||||||
|
|
||||||
value64 = value;
|
value64 = value;
|
||||||
#if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
|
MEMCHR_MASK_GEN(value64);
|
||||||
value64 *= 0x0101010101010101ULL;
|
|
||||||
#elif defined(CONFIG_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;
|
prefix = (unsigned long)start % 8;
|
||||||
if (prefix) {
|
if (prefix) {
|
||||||
|
Loading…
Reference in New Issue
Block a user