| 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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 168   (*memcopy_function)(dest, src, size); | 168   (*memcopy_function)(dest, src, size); | 
| 169 #ifdef DEBUG | 169 #ifdef DEBUG | 
| 170   CHECK_EQ(0, memcmp(dest, src, size)); | 170   CHECK_EQ(0, memcmp(dest, src, size)); | 
| 171 #endif | 171 #endif | 
| 172 } | 172 } | 
| 173 #endif  // V8_TARGET_ARCH_IA32 | 173 #endif  // V8_TARGET_ARCH_IA32 | 
| 174 | 174 | 
| 175 #ifdef _WIN64 | 175 #ifdef _WIN64 | 
| 176 typedef double (*ModuloFunction)(double, double); | 176 typedef double (*ModuloFunction)(double, double); | 
| 177 static ModuloFunction modulo_function = NULL; | 177 static ModuloFunction modulo_function = NULL; | 
| 178 static LazyMutex modulo_function_mutex = LAZY_MUTEX_INITIALIZER; | 178 V8_DECLARE_ONCE(modulo_function_init_once); | 
| 179 // Defined in codegen-x64.cc. | 179 // Defined in codegen-x64.cc. | 
| 180 ModuloFunction CreateModuloFunction(); | 180 ModuloFunction CreateModuloFunction(); | 
| 181 | 181 | 
|  | 182 void init_modulo_function() { | 
|  | 183   modulo_function = CreateModuloFunction(); | 
|  | 184   MemoryBarrier(); | 
|  | 185 } | 
|  | 186 | 
| 182 double modulo(double x, double y) { | 187 double modulo(double x, double y) { | 
| 183   if (modulo_function == NULL) { | 188   CallOnce(&modulo_function_init_once, &init_modulo_function); | 
| 184     ScopedLock lock(modulo_function_mutex.Pointer()); |  | 
| 185     if (modulo_function == NULL) { |  | 
| 186       ModuloFunction temp = CreateModuloFunction(); |  | 
| 187       MemoryBarrier(); |  | 
| 188       modulo_function = temp; |  | 
| 189     } |  | 
| 190   } |  | 
| 191   // Note: here we rely on dependent reads being ordered. This is true | 189   // Note: here we rely on dependent reads being ordered. This is true | 
| 192   // on all architectures we currently support. | 190   // on all architectures we currently support. | 
| 193   return (*modulo_function)(x, y); | 191   return (*modulo_function)(x, y); | 
| 194 } | 192 } | 
| 195 #else  // Win32 | 193 #else  // Win32 | 
| 196 | 194 | 
| 197 double modulo(double x, double y) { | 195 double modulo(double x, double y) { | 
| 198   // Workaround MS fmod bugs. ECMA-262 says: | 196   // Workaround MS fmod bugs. ECMA-262 says: | 
| 199   // dividend is finite and divisor is an infinity => result equals dividend | 197   // dividend is finite and divisor is an infinity => result equals dividend | 
| 200   // dividend is a zero and divisor is nonzero finite => result equals dividend | 198   // dividend is a zero and divisor is nonzero finite => result equals dividend | 
| 201   if (!(isfinite(x) && (!isfinite(y) && !isnan(y))) && | 199   if (!(isfinite(x) && (!isfinite(y) && !isnan(y))) && | 
| 202       !(x == 0 && (y != 0 && isfinite(y)))) { | 200       !(x == 0 && (y != 0 && isfinite(y)))) { | 
| 203     x = fmod(x, y); | 201     x = fmod(x, y); | 
| 204   } | 202   } | 
| 205   return x; | 203   return x; | 
| 206 } | 204 } | 
| 207 | 205 | 
| 208 #endif  // _WIN64 | 206 #endif  // _WIN64 | 
| 209 | 207 | 
| 210 | 208 | 
| 211 static Mutex* math_function_mutex = OS::CreateMutex(); |  | 
| 212 |  | 
| 213 #define UNARY_MATH_FUNCTION(name, generator)             \ | 209 #define UNARY_MATH_FUNCTION(name, generator)             \ | 
| 214 static UnaryMathFunction fast_##name##_function = NULL;  \ | 210 static UnaryMathFunction fast_##name##_function = NULL;  \ | 
|  | 211 V8_DECLARE_ONCE(fast_##name##_init_once);                \ | 
|  | 212 void init_fast_##name##_function() {                     \ | 
|  | 213   fast_##name##_function = generator;                    \ | 
|  | 214   MemoryBarrier();                                       \ | 
|  | 215 }                                                        \ | 
| 215 double fast_##name(double x) {                           \ | 216 double fast_##name(double x) {                           \ | 
| 216   if (fast_##name##_function == NULL) {                  \ | 217   CallOnce(&fast_##name##_init_once,                     \ | 
| 217     ScopedLock lock(math_function_mutex);                \ | 218            &init_fast_##name##_function);                \ | 
| 218     UnaryMathFunction temp = generator;                  \ |  | 
| 219     MemoryBarrier();                                     \ |  | 
| 220     fast_##name##_function = temp;                       \ |  | 
| 221   }                                                      \ |  | 
| 222   return (*fast_##name##_function)(x);                   \ | 219   return (*fast_##name##_function)(x);                   \ | 
| 223 } | 220 } | 
| 224 | 221 | 
| 225 UNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) | 222 UNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) | 
| 226 UNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) | 223 UNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) | 
| 227 UNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) | 224 UNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) | 
| 228 UNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) | 225 UNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) | 
| 229 UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) | 226 UNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) | 
| 230 | 227 | 
| 231 #undef MATH_FUNCTION | 228 #undef MATH_FUNCTION | 
| (...skipping 1862 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2094 | 2091 | 
| 2095 | 2092 | 
| 2096 void Sampler::Stop() { | 2093 void Sampler::Stop() { | 
| 2097   ASSERT(IsActive()); | 2094   ASSERT(IsActive()); | 
| 2098   SamplerThread::RemoveActiveSampler(this); | 2095   SamplerThread::RemoveActiveSampler(this); | 
| 2099   SetActive(false); | 2096   SetActive(false); | 
| 2100 } | 2097 } | 
| 2101 | 2098 | 
| 2102 | 2099 | 
| 2103 } }  // namespace v8::internal | 2100 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|