Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 931 | 931 |
| 932 math_exp_constants_array = new double[9]; | 932 math_exp_constants_array = new double[9]; |
| 933 // Input values smaller than this always return 0. | 933 // Input values smaller than this always return 0. |
| 934 math_exp_constants_array[0] = -708.39641853226408; | 934 math_exp_constants_array[0] = -708.39641853226408; |
| 935 // Input values larger than this always return +Infinity. | 935 // Input values larger than this always return +Infinity. |
| 936 math_exp_constants_array[1] = 709.78271289338397; | 936 math_exp_constants_array[1] = 709.78271289338397; |
| 937 math_exp_constants_array[2] = V8_INFINITY; | 937 math_exp_constants_array[2] = V8_INFINITY; |
| 938 // The rest is black magic. Do not attempt to understand it. It is | 938 // The rest is black magic. Do not attempt to understand it. It is |
| 939 // loosely based on the "expd" function published at: | 939 // loosely based on the "expd" function published at: |
| 940 // http://herumi.blogspot.com/2011/08/fast-double-precision-exponential.html | 940 // http://herumi.blogspot.com/2011/08/fast-double-precision-exponential.html |
| 941 const double constant3 = (1 << kTableSizeBits) / log(2.0); | 941 const double constant3 = (1 << kTableSizeBits) / std::log(2.0); |
| 942 math_exp_constants_array[3] = constant3; | 942 math_exp_constants_array[3] = constant3; |
| 943 math_exp_constants_array[4] = | 943 math_exp_constants_array[4] = |
| 944 static_cast<double>(static_cast<int64_t>(3) << 51); | 944 static_cast<double>(static_cast<int64_t>(3) << 51); |
| 945 math_exp_constants_array[5] = 1 / constant3; | 945 math_exp_constants_array[5] = 1 / constant3; |
| 946 math_exp_constants_array[6] = 3.0000000027955394; | 946 math_exp_constants_array[6] = 3.0000000027955394; |
| 947 math_exp_constants_array[7] = 0.16666666685227835; | 947 math_exp_constants_array[7] = 0.16666666685227835; |
| 948 math_exp_constants_array[8] = 1; | 948 math_exp_constants_array[8] = 1; |
| 949 | 949 |
| 950 math_exp_log_table_array = new double[kTableSize]; | 950 math_exp_log_table_array = new double[kTableSize]; |
| 951 for (int i = 0; i < kTableSize; i++) { | 951 for (int i = 0; i < kTableSize; i++) { |
| 952 double value = pow(2, i / kTableSizeDouble); | 952 double value = std::pow(2, i / kTableSizeDouble); |
| 953 uint64_t bits = BitCast<uint64_t, double>(value); | 953 uint64_t bits = BitCast<uint64_t, double>(value); |
| 954 bits &= (static_cast<uint64_t>(1) << 52) - 1; | 954 bits &= (static_cast<uint64_t>(1) << 52) - 1; |
| 955 double mantissa = BitCast<double, uint64_t>(bits); | 955 double mantissa = BitCast<double, uint64_t>(bits); |
| 956 math_exp_log_table_array[i] = mantissa; | 956 math_exp_log_table_array[i] = mantissa; |
| 957 } | 957 } |
| 958 | 958 |
| 959 math_exp_data_initialized = true; | 959 math_exp_data_initialized = true; |
| 960 } | 960 } |
| 961 } | 961 } |
| 962 | 962 |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1385 return ExternalReference(isolate->regexp_stack()->memory_size_address()); | 1385 return ExternalReference(isolate->regexp_stack()->memory_size_address()); |
| 1386 } | 1386 } |
| 1387 | 1387 |
| 1388 #endif // V8_INTERPRETED_REGEXP | 1388 #endif // V8_INTERPRETED_REGEXP |
| 1389 | 1389 |
| 1390 | 1390 |
| 1391 ExternalReference ExternalReference::math_log_double_function( | 1391 ExternalReference ExternalReference::math_log_double_function( |
| 1392 Isolate* isolate) { | 1392 Isolate* isolate) { |
| 1393 typedef double (*d2d)(double x); | 1393 typedef double (*d2d)(double x); |
| 1394 return ExternalReference(Redirect(isolate, | 1394 return ExternalReference(Redirect(isolate, |
| 1395 FUNCTION_ADDR(static_cast<d2d>(log)), | 1395 FUNCTION_ADDR(static_cast<d2d>(std::log)), |
| 1396 BUILTIN_FP_CALL)); | 1396 BUILTIN_FP_CALL)); |
| 1397 } | 1397 } |
| 1398 | 1398 |
| 1399 | 1399 |
| 1400 ExternalReference ExternalReference::math_exp_constants(int constant_index) { | 1400 ExternalReference ExternalReference::math_exp_constants(int constant_index) { |
| 1401 ASSERT(math_exp_data_initialized); | 1401 ASSERT(math_exp_data_initialized); |
| 1402 return ExternalReference( | 1402 return ExternalReference( |
| 1403 reinterpret_cast<void*>(math_exp_constants_array + constant_index)); | 1403 reinterpret_cast<void*>(math_exp_constants_array + constant_index)); |
| 1404 } | 1404 } |
| 1405 | 1405 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1456 } | 1456 } |
| 1457 | 1457 |
| 1458 | 1458 |
| 1459 double power_double_double(double x, double y) { | 1459 double power_double_double(double x, double y) { |
| 1460 #if defined(__MINGW64_VERSION_MAJOR) && \ | 1460 #if defined(__MINGW64_VERSION_MAJOR) && \ |
| 1461 (!defined(__MINGW64_VERSION_RC) || __MINGW64_VERSION_RC < 1) | 1461 (!defined(__MINGW64_VERSION_RC) || __MINGW64_VERSION_RC < 1) |
| 1462 // MinGW64 has a custom implementation for pow. This handles certain | 1462 // MinGW64 has a custom implementation for pow. This handles certain |
| 1463 // special cases that are different. | 1463 // special cases that are different. |
| 1464 if ((x == 0.0 || std::isinf(x)) && std::isfinite(y)) { | 1464 if ((x == 0.0 || std::isinf(x)) && std::isfinite(y)) { |
| 1465 double f; | 1465 double f; |
| 1466 if (modf(y, &f) != 0.0) return ((x == 0.0) ^ (y > 0)) ? V8_INFINITY : 0; | 1466 if (modf(y, &f) != 0.0) return ((x == 0.0) ^ (y > 0)) ? V8_INFINITY : 0; |
|
Benedikt Meurer
2014/01/07 08:20:27
std::modf
| |
| 1467 } | 1467 } |
| 1468 | 1468 |
| 1469 if (x == 2.0) { | 1469 if (x == 2.0) { |
| 1470 int y_int = static_cast<int>(y); | 1470 int y_int = static_cast<int>(y); |
| 1471 if (y == y_int) return ldexp(1.0, y_int); | 1471 if (y == y_int) return ldexp(1.0, y_int); |
|
Benedikt Meurer
2014/01/07 08:20:27
std::ldexp
| |
| 1472 } | 1472 } |
| 1473 #endif | 1473 #endif |
| 1474 | 1474 |
| 1475 // The checks for special cases can be dropped in ia32 because it has already | 1475 // The checks for special cases can be dropped in ia32 because it has already |
| 1476 // been done in generated code before bailing out here. | 1476 // been done in generated code before bailing out here. |
| 1477 if (std::isnan(y) || ((x == 1 || x == -1) && std::isinf(y))) { | 1477 if (std::isnan(y) || ((x == 1 || x == -1) && std::isinf(y))) { |
| 1478 return OS::nan_value(); | 1478 return OS::nan_value(); |
| 1479 } | 1479 } |
| 1480 return pow(x, y); | 1480 return std::pow(x, y); |
| 1481 } | 1481 } |
| 1482 | 1482 |
| 1483 | 1483 |
| 1484 ExternalReference ExternalReference::power_double_double_function( | 1484 ExternalReference ExternalReference::power_double_double_function( |
| 1485 Isolate* isolate) { | 1485 Isolate* isolate) { |
| 1486 return ExternalReference(Redirect(isolate, | 1486 return ExternalReference(Redirect(isolate, |
| 1487 FUNCTION_ADDR(power_double_double), | 1487 FUNCTION_ADDR(power_double_double), |
| 1488 BUILTIN_FP_FP_CALL)); | 1488 BUILTIN_FP_FP_CALL)); |
| 1489 } | 1489 } |
| 1490 | 1490 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1589 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); | 1589 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); |
| 1590 state_.written_position = state_.current_position; | 1590 state_.written_position = state_.current_position; |
| 1591 written = true; | 1591 written = true; |
| 1592 } | 1592 } |
| 1593 | 1593 |
| 1594 // Return whether something was written. | 1594 // Return whether something was written. |
| 1595 return written; | 1595 return written; |
| 1596 } | 1596 } |
| 1597 | 1597 |
| 1598 } } // namespace v8::internal | 1598 } } // namespace v8::internal |
| OLD | NEW |