| Index: src/arm64/utils-arm64.h
 | 
| diff --git a/src/arm64/utils-arm64.h b/src/arm64/utils-arm64.h
 | 
| index 35d982483750d65647980b274025f88598837d09..920a84dbdfd24a65ad5c0e3b34e11cbe617ca4e8 100644
 | 
| --- a/src/arm64/utils-arm64.h
 | 
| +++ b/src/arm64/utils-arm64.h
 | 
| @@ -8,6 +8,7 @@
 | 
|  #include <cmath>
 | 
|  
 | 
|  #include "src/arm64/constants-arm64.h"
 | 
| +#include "src/utils.h"
 | 
|  
 | 
|  namespace v8 {
 | 
|  namespace internal {
 | 
| @@ -16,40 +17,26 @@ namespace internal {
 | 
|  STATIC_ASSERT((static_cast<int32_t>(-1) >> 1) == -1);
 | 
|  STATIC_ASSERT((static_cast<uint32_t>(-1) >> 1) == 0x7FFFFFFF);
 | 
|  
 | 
| -// 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;
 | 
| -}
 | 
| +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);
 | 
|  
 | 
| +float float_pack(uint32_t sign, uint32_t exp, uint32_t mantissa);
 | 
| +double double_pack(uint64_t sign, uint64_t exp, uint64_t mantissa);
 | 
|  
 | 
| -static inline double rawbits_to_double(uint64_t bits) {
 | 
| -  double value = 0.0;
 | 
| -  memcpy(&value, &bits, 8);
 | 
| -  return value;
 | 
| -}
 | 
| -
 | 
| +// An fpclassify() function for 16-bit half-precision floats.
 | 
| +int float16classify(float16 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);
 | 
|  
 | 
| @@ -86,7 +73,7 @@ T ReverseBytes(T value, int block_bytes_log2) {
 | 
|  
 | 
|  // NaN tests.
 | 
|  inline bool IsSignallingNaN(double num) {
 | 
| -  uint64_t raw = double_to_rawbits(num);
 | 
| +  uint64_t raw = bit_cast<uint64_t>(num);
 | 
|    if (std::isnan(num) && ((raw & kDQuietNanMask) == 0)) {
 | 
|      return true;
 | 
|    }
 | 
| @@ -95,13 +82,17 @@ inline bool IsSignallingNaN(double num) {
 | 
|  
 | 
|  
 | 
|  inline bool IsSignallingNaN(float num) {
 | 
| -  uint32_t raw = float_to_rawbits(num);
 | 
| +  uint32_t raw = bit_cast<uint32_t>(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) {
 | 
| @@ -112,13 +103,14 @@ inline bool IsQuietNaN(T num) {
 | 
|  // Convert the NaN in 'num' to a quiet NaN.
 | 
|  inline double ToQuietNaN(double num) {
 | 
|    DCHECK(std::isnan(num));
 | 
| -  return rawbits_to_double(double_to_rawbits(num) | kDQuietNanMask);
 | 
| +  return bit_cast<double>(bit_cast<uint64_t>(num) | kDQuietNanMask);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  inline float ToQuietNaN(float num) {
 | 
|    DCHECK(std::isnan(num));
 | 
| -  return rawbits_to_float(float_to_rawbits(num) | kSQuietNanMask);
 | 
| +  return bit_cast<float>(bit_cast<uint32_t>(num) |
 | 
| +                         static_cast<uint32_t>(kSQuietNanMask));
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |