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) { |