1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* string.c (search_nonascii): use nlz on big endian environments.

* internal.h (nlz_intpr): defined.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54859 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2016-04-30 22:32:05 +00:00
parent aa2395b887
commit 0f0121fe1a
3 changed files with 19 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Sun May 1 07:30:44 2016 NARUSE, Yui <naruse@ruby-lang.org>
* string.c (search_nonascii): use nlz on big endian environments.
* internal.h (nlz_intpr): defined.
Sun May 1 00:03:30 2016 NARUSE, Yui <naruse@ruby-lang.org>
* configure.in (__builtin_ctz): check.

View file

@ -260,6 +260,15 @@ nlz_int128(uint128_t x)
}
#endif
static inline int
nlz_intptr(uintptr_t x) {
#if SIZEOF_VOIDP == 8
return nlz_long_long(x);
#elif SIZEOF_VOIDP == 4
return nlz_int(x);
#endif
}
static inline int
rb_popcount32(uint32_t x) {
x = (x & 0x55555555) + (x >> 1 & 0x55555555);

View file

@ -449,7 +449,11 @@ search_nonascii(const char *p, const char *e)
const uintptr_t *t = (const uintptr_t *)(e - (SIZEOF_VOIDP-1));
for (;s < t; s++) {
if (*s & NONASCII_MASK) {
#if BYTE_ORDER == LITTLE_ENDIAN
return (const char *)s + (ntz_intptr(*s&NONASCII_MASK)>>3);
#else
return (const char *)s + (nlz_intptr(*s&NONASCII_MASK)>>3);
#endif
}
}
p = (const char *)s;