Index: src/platform.h |
diff --git a/src/platform.h b/src/platform.h |
index 211be39d00c781b7075250d0e149e2b8dcc676e0..8b27c19a65f45d92cb8fdf2f52f0adad14715865 100644 |
--- a/src/platform.h |
+++ b/src/platform.h |
@@ -69,6 +69,7 @@ int signbit(double x); |
// Microsoft Visual C++ specific stuff. |
#ifdef _MSC_VER |
+#include "win32-headers.h" |
#include "win32-math.h" |
int strncasecmp(const char* s1, const char* s2, int n); |
@@ -90,7 +91,6 @@ inline int lrint(double flt) { |
return intgr; |
} |
- |
#endif // _MSC_VER |
#ifndef __CYGWIN__ |
@@ -101,7 +101,6 @@ int random(); |
#endif // WIN32 |
#include "lazy-instance.h" |
-#include "platform-tls.h" |
#include "utils.h" |
#include "v8globals.h" |
@@ -129,6 +128,60 @@ void lazily_initialize_fast_exp(); |
class Socket; |
// ---------------------------------------------------------------------------- |
+// Fast TLS support |
+ |
+#ifndef V8_NO_FAST_TLS |
+ |
+#if defined(_MSC_VER) && V8_HOST_ARCH_IA32 |
+ |
+#define V8_FAST_TLS_SUPPORTED 1 |
+ |
+INLINE(intptr_t InternalGetExistingThreadLocal(intptr_t index)); |
+ |
+inline intptr_t InternalGetExistingThreadLocal(intptr_t index) { |
+ const intptr_t kTibInlineTlsOffset = 0xE10; |
+ const intptr_t kTibExtraTlsOffset = 0xF94; |
+ const intptr_t kMaxInlineSlots = 64; |
+ const intptr_t kMaxSlots = kMaxInlineSlots + 1024; |
+ ASSERT(0 <= index && index < kMaxSlots); |
+ if (index < kMaxInlineSlots) { |
+ return static_cast<intptr_t>(__readfsdword(kTibInlineTlsOffset + |
+ kPointerSize * index)); |
+ } |
+ intptr_t extra = static_cast<intptr_t>(__readfsdword(kTibExtraTlsOffset)); |
+ ASSERT(extra != 0); |
+ return *reinterpret_cast<intptr_t*>(extra + |
+ kPointerSize * (index - kMaxInlineSlots)); |
+} |
+ |
+#elif defined(__APPLE__) && (V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64) |
+ |
+#define V8_FAST_TLS_SUPPORTED 1 |
+ |
+extern intptr_t kMacTlsBaseOffset; |
+ |
+INLINE(intptr_t InternalGetExistingThreadLocal(intptr_t index)); |
+ |
+inline intptr_t InternalGetExistingThreadLocal(intptr_t index) { |
+ intptr_t result; |
+#if V8_HOST_ARCH_IA32 |
+ asm("movl %%gs:(%1,%2,4), %0;" |
+ :"=r"(result) // Output must be a writable register. |
+ :"r"(kMacTlsBaseOffset), "r"(index)); |
+#else |
+ asm("movq %%gs:(%1,%2,8), %0;" |
+ :"=r"(result) |
+ :"r"(kMacTlsBaseOffset), "r"(index)); |
+#endif |
+ return result; |
+} |
+ |
+#endif |
+ |
+#endif // V8_NO_FAST_TLS |
+ |
+ |
+// ---------------------------------------------------------------------------- |
// OS |
// |
// This class has static methods for the different platform specific |