Chromium Code Reviews| Index: src/utils.h |
| diff --git a/src/utils.h b/src/utils.h |
| index 7c818671d52f0d7462b41d7eaf1c26a278904ec0..c687f4e01eb51d104c924a44a5d2c38601160aa3 100644 |
| --- a/src/utils.h |
| +++ b/src/utils.h |
| @@ -525,12 +525,51 @@ class StringBuilder { |
| }; |
| +// Custom memcpy implementation for platforms where the standard version |
| +// may not be good enough. |
| +// TODO(lrn): Check whether some IA32 platforms should be excluded. |
| +#if defined(V8_TARGET_ARCH_IA32) |
| + |
| +// TODO(lrn): Extend to other platforms as needed, especially X64. |
|
Erik Corry
2010/06/04 07:07:40
I resent that "especially x64"!
Lasse Reichstein
2010/06/04 11:52:13
You think it's more needed on ARM than on X64? :P
|
| + |
| +typedef void (*MemCopyFunction)(void* dest, const void* src, size_t size); |
| + |
| +// Implemented in codegen-<arch>.cc. |
| +MemCopyFunction CreateMemCopyFunction(); |
| + |
| +// Copy memory area to disjoint memory area. |
| +static inline void MemCopy(void* dest, const void* src, size_t size) { |
| + static MemCopyFunction memcopy = CreateMemCopyFunction(); |
| + (*memcopy)(dest, src, size); |
| +} |
| + |
| + |
| +// Limit below which the extra overhead of the MemCopy function is likely |
| +// to outweigh the benefits of faster copying. |
| +// TODO(lrn): Try to find a more precise value. |
| +static const int kMinComplexMemCopy = 256; |
| + |
| +#else // V8_TARGET_ARCH_IA32 |
| + |
| +static inline void MemCopy(void* dest, const void* src, size_t size) { |
| + memcpy(dest, src, size); |
| +} |
| + |
| +static const int kMinComplexMemCopy = 256; |
| + |
| +#endif // V8_TARGET_ARCH_IA32 |
| + |
| + |
| // Copy from ASCII/16bit chars to ASCII/16bit chars. |
| template <typename sourcechar, typename sinkchar> |
| static inline void CopyChars(sinkchar* dest, const sourcechar* src, int chars) { |
| sinkchar* limit = dest + chars; |
| #ifdef V8_HOST_CAN_READ_UNALIGNED |
| if (sizeof(*dest) == sizeof(*src)) { |
| + if (chars >= kMinComplexMemCopy) { |
|
Erik Corry
2010/06/04 07:07:40
This should surely be chars * sizeof(*dest).
Lasse Reichstein
2010/06/04 11:52:13
It would make sense to base the decision on the nu
|
| + MemCopy(dest, src, chars * sizeof(*dest)); |
| + return; |
| + } |
| // Number of characters in a uintptr_t. |
| static const int kStepSize = sizeof(uintptr_t) / sizeof(*dest); // NOLINT |
| while (dest <= limit - kStepSize) { |