| Index: src/arm64/utils-arm64.h
|
| diff --git a/src/arm64/utils-arm64.h b/src/arm64/utils-arm64.h
|
| index 920a84dbdfd24a65ad5c0e3b34e11cbe617ca4e8..35d982483750d65647980b274025f88598837d09 100644
|
| --- a/src/arm64/utils-arm64.h
|
| +++ b/src/arm64/utils-arm64.h
|
| @@ -8,7 +8,6 @@
|
| #include <cmath>
|
|
|
| #include "src/arm64/constants-arm64.h"
|
| -#include "src/utils.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -17,26 +16,40 @@ namespace internal {
|
| STATIC_ASSERT((static_cast<int32_t>(-1) >> 1) == -1);
|
| STATIC_ASSERT((static_cast<uint32_t>(-1) >> 1) == 0x7FFFFFFF);
|
|
|
| -uint32_t float_sign(float val);
|
| -uint32_t float_exp(float val);
|
| -uint32_t float_mantissa(float val);
|
| -uint32_t double_sign(double val);
|
| -uint32_t double_exp(double val);
|
| -uint64_t double_mantissa(double val);
|
| +// Floating point representation.
|
| +static inline uint32_t float_to_rawbits(float value) {
|
| + uint32_t bits = 0;
|
| + memcpy(&bits, &value, 4);
|
| + return bits;
|
| +}
|
| +
|
| +
|
| +static inline uint64_t double_to_rawbits(double value) {
|
| + uint64_t bits = 0;
|
| + memcpy(&bits, &value, 8);
|
| + return bits;
|
| +}
|
| +
|
| +
|
| +static inline float rawbits_to_float(uint32_t bits) {
|
| + float value = 0.0;
|
| + memcpy(&value, &bits, 4);
|
| + return value;
|
| +}
|
|
|
| -float float_pack(uint32_t sign, uint32_t exp, uint32_t mantissa);
|
| -double double_pack(uint64_t sign, uint64_t exp, uint64_t mantissa);
|
|
|
| -// An fpclassify() function for 16-bit half-precision floats.
|
| -int float16classify(float16 value);
|
| +static inline double rawbits_to_double(uint64_t bits) {
|
| + double value = 0.0;
|
| + memcpy(&value, &bits, 8);
|
| + return value;
|
| +}
|
| +
|
|
|
| // Bit counting.
|
| int CountLeadingZeros(uint64_t value, int width);
|
| int CountLeadingSignBits(int64_t value, int width);
|
| int CountTrailingZeros(uint64_t value, int width);
|
| int CountSetBits(uint64_t value, int width);
|
| -int LowestSetBitPosition(uint64_t value);
|
| -int HighestSetBitPosition(uint64_t value);
|
| uint64_t LargestPowerOf2Divisor(uint64_t value);
|
| int MaskToBit(uint64_t mask);
|
|
|
| @@ -73,7 +86,7 @@ T ReverseBytes(T value, int block_bytes_log2) {
|
|
|
| // NaN tests.
|
| inline bool IsSignallingNaN(double num) {
|
| - uint64_t raw = bit_cast<uint64_t>(num);
|
| + uint64_t raw = double_to_rawbits(num);
|
| if (std::isnan(num) && ((raw & kDQuietNanMask) == 0)) {
|
| return true;
|
| }
|
| @@ -82,17 +95,13 @@ inline bool IsSignallingNaN(double num) {
|
|
|
|
|
| inline bool IsSignallingNaN(float num) {
|
| - uint32_t raw = bit_cast<uint32_t>(num);
|
| + uint32_t raw = float_to_rawbits(num);
|
| if (std::isnan(num) && ((raw & kSQuietNanMask) == 0)) {
|
| return true;
|
| }
|
| return false;
|
| }
|
|
|
| -inline bool IsSignallingNaN(float16 num) {
|
| - const uint16_t kFP16QuietNaNMask = 0x0200;
|
| - return (float16classify(num) == FP_NAN) && ((num & kFP16QuietNaNMask) == 0);
|
| -}
|
|
|
| template <typename T>
|
| inline bool IsQuietNaN(T num) {
|
| @@ -103,14 +112,13 @@ inline bool IsQuietNaN(T num) {
|
| // Convert the NaN in 'num' to a quiet NaN.
|
| inline double ToQuietNaN(double num) {
|
| DCHECK(std::isnan(num));
|
| - return bit_cast<double>(bit_cast<uint64_t>(num) | kDQuietNanMask);
|
| + return rawbits_to_double(double_to_rawbits(num) | kDQuietNanMask);
|
| }
|
|
|
|
|
| inline float ToQuietNaN(float num) {
|
| DCHECK(std::isnan(num));
|
| - return bit_cast<float>(bit_cast<uint32_t>(num) |
|
| - static_cast<uint32_t>(kSQuietNanMask));
|
| + return rawbits_to_float(float_to_rawbits(num) | kSQuietNanMask);
|
| }
|
|
|
|
|
|
|