5 #include "src/string-case.h" 7 #include "src/assert-scope.h" 8 #include "src/base/logging.h" 9 #include "src/globals.h" 10 #include "src/utils.h" 16 bool CheckFastAsciiConvert(
char* dst,
const char* src,
int length,
bool changed,
18 bool expected_changed =
false;
19 for (
int i = 0;
i < length;
i++) {
20 if (dst[
i] == src[
i])
continue;
21 expected_changed =
true;
23 DCHECK(
'A' <= src[
i] && src[
i] <=
'Z');
24 DCHECK(dst[
i] == src[
i] + (
'a' -
'A'));
26 DCHECK(
'a' <= src[
i] && src[
i] <=
'z');
27 DCHECK(dst[
i] == src[
i] - (
'a' -
'A'));
30 return (expected_changed == changed);
34 const uintptr_t kOneInEveryByte = kUintptrAllBitsSet / 0xFF;
35 const uintptr_t kAsciiMask = kOneInEveryByte << 7;
47 DCHECK(0 < m && m < n);
49 uintptr_t tmp1 = kOneInEveryByte * (0x7F + n) - w;
51 uintptr_t tmp2 = w + kOneInEveryByte * (0x7F - m);
52 return (tmp1 & tmp2 & (kOneInEveryByte * 0x80));
55 template <
bool is_lower>
56 int FastAsciiConvert(
char* dst,
const char* src,
int length,
59 char* saved_dst = dst;
61 const char* saved_src = src;
62 DisallowHeapAllocation no_gc;
65 DCHECK_EQ(
'a' -
'A', 1 << 5);
67 static const char lo = is_lower ?
'A' - 1 :
'a' - 1;
68 static const char hi = is_lower ?
'Z' + 1 :
'z' + 1;
70 const char*
const limit = src + length;
73 DCHECK(IsAligned(reinterpret_cast<intptr_t>(dst),
sizeof(
uintptr_t)));
75 if (IsAligned(reinterpret_cast<intptr_t>(src),
sizeof(
uintptr_t))) {
78 while (src <= limit -
sizeof(
uintptr_t)) {
80 if ((w & kAsciiMask) != 0)
return static_cast<int>(src - saved_src);
81 if (AsciiRangeMask(w, lo, hi) != 0) {
91 while (src <= limit -
sizeof(
uintptr_t)) {
93 if ((w & kAsciiMask) != 0)
return static_cast<int>(src - saved_src);
98 *
reinterpret_cast<uintptr_t*
>(dst) = w ^ (m >> 2);
105 while (src < limit) {
107 if ((c & kAsciiMask) != 0)
return static_cast<int>(src - saved_src);
108 if (lo < c && c < hi) {
118 CheckFastAsciiConvert(saved_dst, saved_src, length, changed, is_lower));
120 *changed_out = changed;
124 template int FastAsciiConvert<false>(
char* dst,
const char* src,
int length,
126 template int FastAsciiConvert<true>(
char* dst,
const char* src,
int length,