| Index: src/utils.h
|
| diff --git a/src/utils.h b/src/utils.h
|
| index 40aff2c75a12f07b8a010563b35d548f15d8d5cd..07b6490bf363dd4727763eb58dcc26c989dee48b 100644
|
| --- a/src/utils.h
|
| +++ b/src/utils.h
|
| @@ -680,9 +680,20 @@ inline int CompareCharsUnsigned(const lchar* lhs,
|
| const rchar* rhs,
|
| int chars) {
|
| const lchar* limit = lhs + chars;
|
| +#ifdef V8_HOST_CAN_READ_UNALIGNED
|
| if (sizeof(*lhs) == sizeof(*rhs)) {
|
| - return memcmp(lhs, rhs, sizeof(*lhs) * chars);
|
| + // Number of characters in a uintptr_t.
|
| + static const int kStepSize = sizeof(uintptr_t) / sizeof(*lhs); // NOLINT
|
| + while (lhs <= limit - kStepSize) {
|
| + if (*reinterpret_cast<const uintptr_t*>(lhs) !=
|
| + *reinterpret_cast<const uintptr_t*>(rhs)) {
|
| + break;
|
| + }
|
| + lhs += kStepSize;
|
| + rhs += kStepSize;
|
| + }
|
| }
|
| +#endif
|
| while (lhs < limit) {
|
| int r = static_cast<int>(*lhs) - static_cast<int>(*rhs);
|
| if (r != 0) return r;
|
| @@ -1275,11 +1286,15 @@ void CopyChars(sinkchar* dest, const sourcechar* src, int chars) {
|
| template <typename sourcechar, typename sinkchar>
|
| void CopyCharsUnsigned(sinkchar* dest, const sourcechar* src, int chars) {
|
| sinkchar* limit = dest + chars;
|
| +#ifdef V8_HOST_CAN_READ_UNALIGNED
|
| if ((sizeof(*dest) == sizeof(*src)) &&
|
| (chars >= static_cast<int>(kMinComplexMemCopy / sizeof(*dest)))) {
|
| MemCopy(dest, src, chars * sizeof(*dest));
|
| - } else {
|
| - while (dest < limit) *dest++ = static_cast<sinkchar>(*src++);
|
| + return;
|
| + }
|
| +#endif
|
| + while (dest < limit) {
|
| + *dest++ = static_cast<sinkchar>(*src++);
|
| }
|
| }
|
|
|
|
|