aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--string/strlen.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/string/strlen.c b/string/strlen.c
index 0b8aefb812..54f3fb8167 100644
--- a/string/strlen.c
+++ b/string/strlen.c
@@ -46,15 +46,10 @@ STRLEN (const char *str)
longword_ptr = (unsigned long int *) char_ptr;
- /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
- the "holes." Note that there is a hole just to the left of
- each byte, with an extra at the end:
-
- bits: 01111110 11111110 11111110 11111111
- bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
-
- The 1-bits make sure that carries propagate to the next 0-bit.
- The 0-bits provide holes for carries to fall into. */
+ /* Computing (longword - lomagic) sets the high bit of any corresponding
+ byte that is either zero or greater than 0x80. The latter case can be
+ filtered out by computing (~longword & himagic). The final result
+ will always be non-zero if one of the bytes of longword is zero. */
himagic = 0x80808080L;
lomagic = 0x01010101L;
if (sizeof (longword) > 4)
@@ -76,8 +71,7 @@ STRLEN (const char *str)
if (((longword - lomagic) & ~longword & himagic) != 0)
{
- /* Which of the bytes was the zero? If none of them were, it was
- a misfire; continue the search. */
+ /* Which of the bytes was the zero? */
const char *cp = (const char *) (longword_ptr - 1);