OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 #include <limits.h> | 5 #include <limits.h> |
6 #include <stdarg.h> | 6 #include <stdarg.h> |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #if V8_TARGET_ARCH_MIPS64 | 10 #if V8_TARGET_ARCH_MIPS64 |
(...skipping 2315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2326 } | 2326 } |
2327 } | 2327 } |
2328 } | 2328 } |
2329 | 2329 |
2330 | 2330 |
2331 void Simulator::SignalException(Exception e) { | 2331 void Simulator::SignalException(Exception e) { |
2332 V8_Fatal(__FILE__, __LINE__, "Error: Exception %i raised.", | 2332 V8_Fatal(__FILE__, __LINE__, "Error: Exception %i raised.", |
2333 static_cast<int>(e)); | 2333 static_cast<int>(e)); |
2334 } | 2334 } |
2335 | 2335 |
| 2336 // Min/Max template functions for Double and Single arguments. |
| 2337 |
2336 template <typename T> | 2338 template <typename T> |
2337 T FPAbs(T a); | 2339 static T FPAbs(T a); |
2338 | 2340 |
2339 template <> | 2341 template <> |
2340 double FPAbs<double>(double a) { | 2342 double FPAbs<double>(double a) { |
2341 return fabs(a); | 2343 return fabs(a); |
2342 } | 2344 } |
2343 | 2345 |
2344 template <> | 2346 template <> |
2345 float FPAbs<float>(float a) { | 2347 float FPAbs<float>(float a) { |
2346 return fabsf(a); | 2348 return fabsf(a); |
2347 } | 2349 } |
2348 | 2350 |
2349 template <typename T> | 2351 template <typename T> |
2350 bool Simulator::FPUProcessNaNsAndZeros(T a, T b, IsMin min, T& result) { | 2352 static bool FPUProcessNaNsAndZeros(T a, T b, MaxMinKind kind, T& result) { |
2351 if (std::isnan(a) && std::isnan(b)) { | 2353 if (std::isnan(a) && std::isnan(b)) { |
2352 result = a; | 2354 result = a; |
2353 } else if (std::isnan(a)) { | 2355 } else if (std::isnan(a)) { |
2354 result = b; | 2356 result = b; |
2355 } else if (std::isnan(b)) { | 2357 } else if (std::isnan(b)) { |
2356 result = a; | 2358 result = a; |
2357 } else if (b == a) { | 2359 } else if (b == a) { |
2358 // Handle -0.0 == 0.0 case. | 2360 // Handle -0.0 == 0.0 case. |
2359 // std::signbit() returns int 0 or 1 so substracting IsMin::kMax negates the | 2361 // std::signbit() returns int 0 or 1 so substracting MaxMinKind::kMax |
2360 // result. | 2362 // negates the result. |
2361 result = std::signbit(b) - static_cast<int>(min) ? b : a; | 2363 result = std::signbit(b) - static_cast<int>(kind) ? b : a; |
2362 } else { | 2364 } else { |
2363 return false; | 2365 return false; |
2364 } | 2366 } |
2365 return true; | 2367 return true; |
2366 } | 2368 } |
2367 | 2369 |
2368 template <typename T> | 2370 template <typename T> |
2369 T Simulator::FPUMin(T a, T b) { | 2371 static T FPUMin(T a, T b) { |
2370 T result; | 2372 T result; |
2371 if (FPUProcessNaNsAndZeros(a, b, IsMin::kMin, result)) { | 2373 if (FPUProcessNaNsAndZeros(a, b, MaxMinKind::kMin, result)) { |
2372 return result; | 2374 return result; |
2373 } else { | 2375 } else { |
2374 return b < a ? b : a; | 2376 return b < a ? b : a; |
2375 } | 2377 } |
2376 } | 2378 } |
2377 | 2379 |
2378 template <typename T> | 2380 template <typename T> |
2379 T Simulator::FPUMax(T a, T b) { | 2381 static T FPUMax(T a, T b) { |
2380 T result; | 2382 T result; |
2381 if (FPUProcessNaNsAndZeros(a, b, IsMin::kMax, result)) { | 2383 if (FPUProcessNaNsAndZeros(a, b, MaxMinKind::kMax, result)) { |
2382 return result; | 2384 return result; |
2383 } else { | 2385 } else { |
2384 return b > a ? b : a; | 2386 return b > a ? b : a; |
2385 } | 2387 } |
2386 } | 2388 } |
2387 | 2389 |
2388 template <typename T> | 2390 template <typename T> |
2389 T Simulator::FPUMinA(T a, T b) { | 2391 static T FPUMinA(T a, T b) { |
2390 T result; | 2392 T result; |
2391 if (!FPUProcessNaNsAndZeros(a, b, IsMin::kMin, result)) { | 2393 if (!FPUProcessNaNsAndZeros(a, b, MaxMinKind::kMin, result)) { |
2392 if (FPAbs(a) < FPAbs(b)) { | 2394 if (FPAbs(a) < FPAbs(b)) { |
2393 result = a; | 2395 result = a; |
2394 } else if (FPAbs(b) < FPAbs(a)) { | 2396 } else if (FPAbs(b) < FPAbs(a)) { |
2395 result = b; | 2397 result = b; |
2396 } else { | 2398 } else { |
2397 result = a < b ? a : b; | 2399 result = a < b ? a : b; |
2398 } | 2400 } |
2399 } | 2401 } |
2400 return result; | 2402 return result; |
2401 } | 2403 } |
2402 | 2404 |
2403 template <typename T> | 2405 template <typename T> |
2404 T Simulator::FPUMaxA(T a, T b) { | 2406 static T FPUMaxA(T a, T b) { |
2405 T result; | 2407 T result; |
2406 if (!FPUProcessNaNsAndZeros(a, b, IsMin::kMin, result)) { | 2408 if (!FPUProcessNaNsAndZeros(a, b, MaxMinKind::kMin, result)) { |
2407 if (FPAbs(a) > FPAbs(b)) { | 2409 if (FPAbs(a) > FPAbs(b)) { |
2408 result = a; | 2410 result = a; |
2409 } else if (FPAbs(b) > FPAbs(a)) { | 2411 } else if (FPAbs(b) > FPAbs(a)) { |
2410 result = b; | 2412 result = b; |
2411 } else { | 2413 } else { |
2412 result = a > b ? a : b; | 2414 result = a > b ? a : b; |
2413 } | 2415 } |
2414 } | 2416 } |
2415 return result; | 2417 return result; |
2416 } | 2418 } |
(...skipping 2444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4861 } | 4863 } |
4862 | 4864 |
4863 | 4865 |
4864 #undef UNSUPPORTED | 4866 #undef UNSUPPORTED |
4865 } // namespace internal | 4867 } // namespace internal |
4866 } // namespace v8 | 4868 } // namespace v8 |
4867 | 4869 |
4868 #endif // USE_SIMULATOR | 4870 #endif // USE_SIMULATOR |
4869 | 4871 |
4870 #endif // V8_TARGET_ARCH_MIPS64 | 4872 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |