]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
wcsmbs: optimize wcsnlen
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 5 Feb 2019 20:55:59 +0000 (18:55 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 27 Feb 2019 13:00:37 +0000 (10:00 -0300)
This patch rewrites wcsnlen using wmemchr.  The generic wmemchr
already uses the strategy (loop unrolling and tail handling) and
by using it it allows architectures that have optimized wmemchr
(s390 and x86_64) to optimize wcsnlen as well.

Checked on x86_64-linux-gnu.

* wcsmbs/wcsnlen.c (__wcsnlen): Rewrite using wmemchr.

ChangeLog
wcsmbs/wcsnlen.c

index 97e70aa0cb40ff17990e34c9b5ac04d64240580d..9ab66cf7352ef4966384df19d5e28babe6e3e94c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2019-02-27  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * wcsmbs/wcsnlen.c (__wcsnlen): Rewrite using wmemchr.
+
        * wcsmbs/wcsncpy.c (__wcsncpy): Rewrite using wcsnlen, wmemset, and
        wmemcpy.
 
index f3d5fc1fbaabcc7e0cd1f9f789e846b88e248002..d38c7e49533e52cd83692e98b06c8d592067e41b 100644 (file)
 size_t
 __wcsnlen (const wchar_t *s, size_t maxlen)
 {
-  size_t len = 0;
-
-  while (maxlen > 0 && s[len] != L'\0')
-    {
-      ++len;
-      if (--maxlen == 0 || s[len] == L'\0')
-       return len;
-      ++len;
-      if (--maxlen == 0 || s[len] == L'\0')
-       return len;
-      ++len;
-      if (--maxlen == 0 || s[len] == L'\0')
-       return len;
-      ++len;
-      --maxlen;
-    }
-
-  return len;
+  const wchar_t *ret = __wmemchr (s, L'\0', maxlen);
+  if (ret)
+    maxlen = ret - s;
+  return maxlen;
 }
 #ifndef WCSNLEN
 weak_alias (__wcsnlen, wcsnlen)