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