|
@@ -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;
|