2N/A/* Searching in a string. 2N/A Copyright (C) 2003, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 2N/A This program is free software: you can redistribute it and/or modify 2N/A it under the terms of the GNU General Public License as published by 2N/A the Free Software Foundation; either version 3 of the License, or 2N/A (at your option) any later version. 2N/A This program is distributed in the hope that it will be useful, 2N/A but WITHOUT ANY WARRANTY; without even the implied warranty of 2N/A MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2N/A GNU General Public License for more details. 2N/A You should have received a copy of the GNU General Public License 2N/A/* Find the first occurrence of C in S or the final NUL byte. */ 2N/A /* On 32-bit hardware, choosing longword to be a 32-bit unsigned 2N/A long instead of a 64-bit uintmax_t tends to give better 2N/A performance. On 64-bit hardware, unsigned long is generally 64 2N/A bits already. Change this typedef to experiment with 2N/A /* Handle the first few bytes by reading one byte at a time. 2N/A Do this until CHAR_PTR is aligned on a longword boundary. */ 2N/A /* All these elucidatory comments refer to 4-byte longwords, 2N/A but the theory applies equally well to any size longwords. */ 2N/A /* Compute auxiliary longword values: 2N/A repeated_one is a value which has a 1 in every byte. 2N/A repeated_c has c in every byte. */ 2N/A /* Instead of the traditional loop which tests each byte, we will 2N/A test a longword at a time. The tricky part is testing if *any of 2N/A the four* bytes in the longword in question are equal to NUL or 2N/A c. We first use an xor with repeated_c. This reduces the task 2N/A to testing whether *any of the four* bytes in longword1 or 2N/A Let's consider longword1. We compute tmp = 2N/A ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). 2N/A That is, we perform the following operations: 2N/A 1. Subtract repeated_one. 2N/A 3. & a mask consisting of 0x80 in every byte. 2N/A Consider what happens in each byte: 2N/A - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, 2N/A and step 3 transforms it into 0x80. A carry can also be propagated 2N/A to more significant bytes. 2N/A - If a byte of longword1 is nonzero, let its lowest 1 bit be at 2N/A position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, 2N/A the byte ends in a single bit of value 0 and k bits of value 1. 2N/A After step 2, the result is just k bits of value 1: 2^k - 1. After 2N/A step 3, the result is 0. And no carry is produced. 2N/A So, if longword1 has only non-zero bytes, tmp is zero. 2N/A Whereas if longword1 has a zero byte, call j the position of the least 2N/A significant zero byte. Then the result has a zero at positions 0, ..., 2N/A j-1 and a 0x80 at position j. We cannot predict the result at the more 2N/A significant bytes (positions j+1..3), but it does not matter since we 2N/A already have a non-zero bit at position 8*j+7. 2N/A The test whether any byte in longword1 or longword2 is zero is equivalent 2N/A to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine 2N/A this into a single test, whether (tmp1 | tmp2) is nonzero. 2N/A This test can read more than one byte beyond the end of a string, 2N/A depending on where the terminating NUL is encountered. However, 2N/A this is considered safe since the initialization phase ensured 2N/A that the read will be aligned, therefore, the read will not cross 2N/A page boundaries and will not cause a fault. */ 2N/A /* At this point, we know that one of the sizeof (longword) bytes 2N/A starting at char_ptr is == 0 or == c. On little-endian machines, 2N/A we could determine the first such byte without any further memory 2N/A accesses, just by looking at the tmp result from the last loop 2N/A iteration. But this does not work on big-endian machines. 2N/A Choose code that works in both cases. */