| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 (*memcopy_function)(dest, src, size); | 160 (*memcopy_function)(dest, src, size); |
| 161 #ifdef DEBUG | 161 #ifdef DEBUG |
| 162 CHECK_EQ(0, memcmp(dest, src, size)); | 162 CHECK_EQ(0, memcmp(dest, src, size)); |
| 163 #endif | 163 #endif |
| 164 } | 164 } |
| 165 #endif // V8_TARGET_ARCH_IA32 | 165 #endif // V8_TARGET_ARCH_IA32 |
| 166 | 166 |
| 167 #ifdef _WIN64 | 167 #ifdef _WIN64 |
| 168 typedef double (*ModuloFunction)(double, double); | 168 typedef double (*ModuloFunction)(double, double); |
| 169 static ModuloFunction modulo_function = NULL; | 169 static ModuloFunction modulo_function = NULL; |
| 170 V8_DECLARE_ONCE(modulo_function_init_once); | |
| 171 // Defined in codegen-x64.cc. | 170 // Defined in codegen-x64.cc. |
| 172 ModuloFunction CreateModuloFunction(); | 171 ModuloFunction CreateModuloFunction(); |
| 173 | 172 |
| 174 void init_modulo_function() { | 173 void init_modulo_function() { |
| 175 modulo_function = CreateModuloFunction(); | 174 modulo_function = CreateModuloFunction(); |
| 176 } | 175 } |
| 177 | 176 |
| 178 double modulo(double x, double y) { | 177 double modulo(double x, double y) { |
| 179 CallOnce(&modulo_function_init_once, &init_modulo_function); | |
| 180 // Note: here we rely on dependent reads being ordered. This is true | 178 // Note: here we rely on dependent reads being ordered. This is true |
| 181 // on all architectures we currently support. | 179 // on all architectures we currently support. |
| 182 return (*modulo_function)(x, y); | 180 return (*modulo_function)(x, y); |
| 183 } | 181 } |
| 184 #else // Win32 | 182 #else // Win32 |
| 185 | 183 |
| 186 double modulo(double x, double y) { | 184 double modulo(double x, double y) { |
| 187 // Workaround MS fmod bugs. ECMA-262 says: | 185 // Workaround MS fmod bugs. ECMA-262 says: |
| 188 // dividend is finite and divisor is an infinity => result equals dividend | 186 // dividend is finite and divisor is an infinity => result equals dividend |
| 189 // dividend is a zero and divisor is nonzero finite => result equals dividend | 187 // dividend is a zero and divisor is nonzero finite => result equals dividend |
| 190 if (!(isfinite(x) && (!isfinite(y) && !isnan(y))) && | 188 if (!(isfinite(x) && (!isfinite(y) && !isnan(y))) && |
| 191 !(x == 0 && (y != 0 && isfinite(y)))) { | 189 !(x == 0 && (y != 0 && isfinite(y)))) { |
| 192 x = fmod(x, y); | 190 x = fmod(x, y); |
| 193 } | 191 } |
| 194 return x; | 192 return x; |
| 195 } | 193 } |
| 196 | 194 |
| 197 #endif // _WIN64 | 195 #endif // _WIN64 |
| 198 | 196 |
| 199 | 197 |
| 200 #define UNARY_MATH_FUNCTION(name, generator) \ | 198 #define UNARY_MATH_FUNCTION(name, generator) \ |
| 201 static UnaryMathFunction fast_##name##_function = NULL; \ | 199 static UnaryMathFunction fast_##name##_function = NULL; \ |
| 202 V8_DECLARE_ONCE(fast_##name##_init_once); \ | |
| 203 void init_fast_##name##_function() { \ | 200 void init_fast_##name##_function() { \ |
| 204 fast_##name##_function = generator; \ | 201 fast_##name##_function = generator; \ |
| 205 } \ | 202 } \ |
| 206 double fast_##name(double x) { \ | 203 double fast_##name(double x) { \ |
| 207 CallOnce(&fast_##name##_init_once, \ | |
| 208 &init_fast_##name##_function); \ | |
| 209 return (*fast_##name##_function)(x); \ | 204 return (*fast_##name##_function)(x); \ |
| 210 } | 205 } |
| 211 | 206 |
| 212 UNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) | 207 UNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) |
| 213 UNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) | 208 UNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) |
| 214 UNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) | 209 UNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) |
| 215 UNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) | 210 UNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) |
| 216 UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) | 211 UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) |
| 217 | 212 |
| 218 #undef MATH_FUNCTION | 213 #undef MATH_FUNCTION |
| 219 | 214 |
| 220 | 215 |
| 216 void MathSetup() { |
| 217 init_modulo_function(); |
| 218 init_fast_sin_function(); |
| 219 init_fast_cos_function(); |
| 220 init_fast_tan_function(); |
| 221 init_fast_log_function(); |
| 222 init_fast_sqrt_function(); |
| 223 } |
| 224 |
| 225 |
| 221 // ---------------------------------------------------------------------------- | 226 // ---------------------------------------------------------------------------- |
| 222 // The Time class represents time on win32. A timestamp is represented as | 227 // The Time class represents time on win32. A timestamp is represented as |
| 223 // a 64-bit integer in 100 nanoseconds since January 1, 1601 (UTC). JavaScript | 228 // a 64-bit integer in 100 nanoseconds since January 1, 1601 (UTC). JavaScript |
| 224 // timestamps are represented as a doubles in milliseconds since 00:00:00 UTC, | 229 // timestamps are represented as a doubles in milliseconds since 00:00:00 UTC, |
| 225 // January 1, 1970. | 230 // January 1, 1970. |
| 226 | 231 |
| 227 class Time { | 232 class Time { |
| 228 public: | 233 public: |
| 229 // Constructors. | 234 // Constructors. |
| 230 Time(); | 235 Time(); |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 // Convert the current time to a 64-bit integer first, before converting it | 566 // Convert the current time to a 64-bit integer first, before converting it |
| 562 // to an unsigned. Going directly can cause an overflow and the seed to be | 567 // to an unsigned. Going directly can cause an overflow and the seed to be |
| 563 // set to all ones. The seed will be identical for different instances that | 568 // set to all ones. The seed will be identical for different instances that |
| 564 // call this setup code within the same millisecond. | 569 // call this setup code within the same millisecond. |
| 565 uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis()); | 570 uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis()); |
| 566 srand(static_cast<unsigned int>(seed)); | 571 srand(static_cast<unsigned int>(seed)); |
| 567 limit_mutex = CreateMutex(); | 572 limit_mutex = CreateMutex(); |
| 568 } | 573 } |
| 569 | 574 |
| 570 | 575 |
| 576 void OS::PostSetUp() { |
| 577 // Math functions depend on CPU features therefore they are initialized after |
| 578 // CPU. |
| 579 MathSetup(); |
| 580 } |
| 581 |
| 582 |
| 571 // Returns the accumulated user time for thread. | 583 // Returns the accumulated user time for thread. |
| 572 int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { | 584 int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { |
| 573 FILETIME dummy; | 585 FILETIME dummy; |
| 574 uint64_t usertime; | 586 uint64_t usertime; |
| 575 | 587 |
| 576 // Get the amount of time that the thread has executed in user mode. | 588 // Get the amount of time that the thread has executed in user mode. |
| 577 if (!GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &dummy, | 589 if (!GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &dummy, |
| 578 reinterpret_cast<FILETIME*>(&usertime))) return -1; | 590 reinterpret_cast<FILETIME*>(&usertime))) return -1; |
| 579 | 591 |
| 580 // Adjust the resolution to micro-seconds. | 592 // Adjust the resolution to micro-seconds. |
| (...skipping 1506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2087 | 2099 |
| 2088 | 2100 |
| 2089 void Sampler::Stop() { | 2101 void Sampler::Stop() { |
| 2090 ASSERT(IsActive()); | 2102 ASSERT(IsActive()); |
| 2091 SamplerThread::RemoveActiveSampler(this); | 2103 SamplerThread::RemoveActiveSampler(this); |
| 2092 SetActive(false); | 2104 SetActive(false); |
| 2093 } | 2105 } |
| 2094 | 2106 |
| 2095 | 2107 |
| 2096 } } // namespace v8::internal | 2108 } } // namespace v8::internal |
| OLD | NEW |