Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: src/platform-win32.cc

Issue 269823006: Move generated math methods from platform to codegen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/platform-posix.cc ('k') | src/v8.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Platform-specific code for Win32. 5 // Platform-specific code for Win32.
6 6
7 // Secure API functions are not available using MinGW with msvcrt.dll 7 // Secure API functions are not available using MinGW with msvcrt.dll
8 // on Windows XP. Make sure MINGW_HAS_SECURE_API is not defined to 8 // on Windows XP. Make sure MINGW_HAS_SECURE_API is not defined to
9 // disable definition of secure API functions in standard headers that 9 // disable definition of secure API functions in standard headers that
10 // would conflict with our own implementation. 10 // would conflict with our own implementation.
11 #ifdef __MINGW32__ 11 #ifdef __MINGW32__
12 #include <_mingw.h> 12 #include <_mingw.h>
13 #ifdef MINGW_HAS_SECURE_API 13 #ifdef MINGW_HAS_SECURE_API
14 #undef MINGW_HAS_SECURE_API 14 #undef MINGW_HAS_SECURE_API
15 #endif // MINGW_HAS_SECURE_API 15 #endif // MINGW_HAS_SECURE_API
16 #endif // __MINGW32__ 16 #endif // __MINGW32__
17 17
18 #include "win32-headers.h" 18 #include "win32-headers.h"
19 19
20 #include "v8.h" 20 #include "v8.h"
21 21
22 #include "codegen.h"
23 #include "isolate-inl.h" 22 #include "isolate-inl.h"
24 #include "platform.h" 23 #include "platform.h"
25 24
26 #ifdef _MSC_VER 25 #ifdef _MSC_VER
27 26
28 // Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually 27 // Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually
29 // defined in strings.h. 28 // defined in strings.h.
30 int strncasecmp(const char* s1, const char* s2, int n) { 29 int strncasecmp(const char* s1, const char* s2, int n) {
31 return _strnicmp(s1, s2, n); 30 return _strnicmp(s1, s2, n);
32 } 31 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 // Copy memory area to disjoint memory area. 122 // Copy memory area to disjoint memory area.
124 void OS::MemMove(void* dest, const void* src, size_t size) { 123 void OS::MemMove(void* dest, const void* src, size_t size) {
125 if (size == 0) return; 124 if (size == 0) return;
126 // Note: here we rely on dependent reads being ordered. This is true 125 // Note: here we rely on dependent reads being ordered. This is true
127 // on all architectures we currently support. 126 // on all architectures we currently support.
128 (*memmove_function)(dest, src, size); 127 (*memmove_function)(dest, src, size);
129 } 128 }
130 129
131 #endif // V8_TARGET_ARCH_IA32 130 #endif // V8_TARGET_ARCH_IA32
132 131
133 #ifdef _WIN64
134 typedef double (*ModuloFunction)(double, double);
135 static ModuloFunction modulo_function = NULL;
136 // Defined in codegen-x64.cc.
137 ModuloFunction CreateModuloFunction();
138
139 void init_modulo_function() {
140 modulo_function = CreateModuloFunction();
141 }
142
143
144 double modulo(double x, double y) {
145 // Note: here we rely on dependent reads being ordered. This is true
146 // on all architectures we currently support.
147 return (*modulo_function)(x, y);
148 }
149 #else // Win32
150
151 double modulo(double x, double y) {
152 // Workaround MS fmod bugs. ECMA-262 says:
153 // dividend is finite and divisor is an infinity => result equals dividend
154 // dividend is a zero and divisor is nonzero finite => result equals dividend
155 if (!(std::isfinite(x) && (!std::isfinite(y) && !std::isnan(y))) &&
156 !(x == 0 && (y != 0 && std::isfinite(y)))) {
157 x = fmod(x, y);
158 }
159 return x;
160 }
161
162 #endif // _WIN64
163
164
165 #define UNARY_MATH_FUNCTION(name, generator) \
166 static UnaryMathFunction fast_##name##_function = NULL; \
167 void init_fast_##name##_function() { \
168 fast_##name##_function = generator; \
169 } \
170 double fast_##name(double x) { \
171 return (*fast_##name##_function)(x); \
172 }
173
174 UNARY_MATH_FUNCTION(exp, CreateExpFunction())
175 UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction())
176
177 #undef UNARY_MATH_FUNCTION
178
179
180 void lazily_initialize_fast_exp() {
181 if (fast_exp_function == NULL) {
182 init_fast_exp_function();
183 }
184 }
185
186
187 void MathSetup() {
188 #ifdef _WIN64
189 init_modulo_function();
190 #endif
191 // fast_exp is initialized lazily.
192 init_fast_sqrt_function();
193 }
194
195 132
196 class TimezoneCache { 133 class TimezoneCache {
197 public: 134 public:
198 TimezoneCache() : initialized_(false) { } 135 TimezoneCache() : initialized_(false) { }
199 136
200 void Clear() { 137 void Clear() {
201 initialized_ = false; 138 initialized_ = false;
202 } 139 }
203 140
204 // Initialize timezone information. The timezone information is obtained from 141 // Initialize timezone information. The timezone information is obtained from
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 // Returns a string identifying the current timezone for the 446 // Returns a string identifying the current timezone for the
510 // timestamp taking into account daylight saving. 447 // timestamp taking into account daylight saving.
511 char* Win32Time::LocalTimezone(TimezoneCache* cache) { 448 char* Win32Time::LocalTimezone(TimezoneCache* cache) {
512 // Return the standard or DST time zone name based on whether daylight 449 // Return the standard or DST time zone name based on whether daylight
513 // saving is in effect at the given time. 450 // saving is in effect at the given time.
514 return InDST(cache) ? cache->dst_tz_name_ : cache->std_tz_name_; 451 return InDST(cache) ? cache->dst_tz_name_ : cache->std_tz_name_;
515 } 452 }
516 453
517 454
518 void OS::PostSetUp() { 455 void OS::PostSetUp() {
519 // Math functions depend on CPU features therefore they are initialized after
520 // CPU.
521 MathSetup();
522 #if V8_TARGET_ARCH_IA32 456 #if V8_TARGET_ARCH_IA32
523 OS::MemMoveFunction generated_memmove = CreateMemMoveFunction(); 457 OS::MemMoveFunction generated_memmove = CreateMemMoveFunction();
524 if (generated_memmove != NULL) { 458 if (generated_memmove != NULL) {
525 memmove_function = generated_memmove; 459 memmove_function = generated_memmove;
526 } 460 }
527 #endif 461 #endif
528 } 462 }
529 463
530 464
531 // Returns the accumulated user time for thread. 465 // Returns the accumulated user time for thread.
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 ASSERT(result); 1422 ASSERT(result);
1489 } 1423 }
1490 1424
1491 1425
1492 1426
1493 void Thread::YieldCPU() { 1427 void Thread::YieldCPU() {
1494 Sleep(0); 1428 Sleep(0);
1495 } 1429 }
1496 1430
1497 } } // namespace v8::internal 1431 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/platform-posix.cc ('k') | src/v8.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698