/** * Fallback implementation for finding the first non-ASCII character in a * UTF-16 string. */ static inline int32_t FirstNonASCIIUnvectorized(const char16_t* aBegin, const char16_t* aEnd) { typedef mozilla::NonASCIIParameters<sizeof(size_t)> p; const size_t kMask = p::mask(); const uintptr_t kAlignMask = p::alignMask(); const size_t kNumUnicharsPerWord = p::numUnicharsPerWord(); const char16_t* idx = aBegin; // Align ourselves to a word boundary. for (; idx != aEnd && ((uintptr_t(idx) & kAlignMask) != 0); idx++) { if (!IsASCII(*idx)) { return idx - aBegin; } } // Check one word at a time. const char16_t* wordWalkEnd = mozilla::aligned(aEnd, kAlignMask); for (; idx != wordWalkEnd; idx += kNumUnicharsPerWord) { const size_t word = *reinterpret_cast<const size_t*>(idx); if (word & kMask) { return idx - aBegin; } } // Take care of the remainder one character at a time. for (; idx != aEnd; idx++) { if (!IsASCII(*idx)) { return idx - aBegin; } } return -1; }