1 // Copyright 2017 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <cstdint> 6 7 #include "include/v8config.h" 8 #include "src/base/macros.h" 9 #include "src/codegen/arm64/constants-arm64.h" 10 11 namespace v8 { 12 namespace internal { 13 14 // ISA constants. -------------------------------------------------------------- 15 16 // The following code initializes float/double variables with bit patterns. 17 // 18 // TODO(mostynb): replace these with std::numeric_limits constexpr's where 19 // possible, and figure out how to replace *DefaultNaN with something clean, 20 // then move this code back into instructions-arm64.cc with the same types 21 // that client code uses. 22 23 namespace integer_constants { 24 constexpr uint16_t kFP16PositiveInfinity = 0x7C00; 25 constexpr uint16_t kFP16NegativeInfinity = 0xFC00; 26 constexpr uint32_t kFP32PositiveInfinity = 0x7F800000; 27 constexpr uint32_t kFP32NegativeInfinity = 0xFF800000; 28 constexpr uint64_t kFP64PositiveInfinity = 0x7FF0000000000000UL; 29 constexpr uint64_t kFP64NegativeInfinity = 0xFFF0000000000000UL; 30 31 // This value is a signalling NaN as both a double and as a float (taking the 32 // least-significant word). 33 constexpr uint64_t kFP64SignallingNaN = 0x7FF000007F800001; 34 constexpr uint32_t kFP32SignallingNaN = 0x7F800001; 35 36 // A similar value, but as a quiet NaN. 37 constexpr uint64_t kFP64QuietNaN = 0x7FF800007FC00001; 38 constexpr uint32_t kFP32QuietNaN = 0x7FC00001; 39 40 // The default NaN values (for FPCR.DN=1). 41 constexpr uint64_t kFP64DefaultNaN = 0x7FF8000000000000UL; 42 constexpr uint32_t kFP32DefaultNaN = 0x7FC00000; 43 extern const uint16_t kFP16DefaultNaN = 0x7E00; 44 } // namespace integer_constants 45 46 #if defined(V8_OS_WIN) 47 extern "C" { 48 #endif 49 50 extern const float16 kFP16PositiveInfinity = 51 bit_cast<float16>(integer_constants::kFP16PositiveInfinity); 52 extern const float16 kFP16NegativeInfinity = 53 bit_cast<float16>(integer_constants::kFP16NegativeInfinity); 54 V8_EXPORT_PRIVATE extern const float kFP32PositiveInfinity = 55 bit_cast<float>(integer_constants::kFP32PositiveInfinity); 56 V8_EXPORT_PRIVATE extern const float kFP32NegativeInfinity = 57 bit_cast<float>(integer_constants::kFP32NegativeInfinity); 58 V8_EXPORT_PRIVATE extern const double kFP64PositiveInfinity = 59 bit_cast<double>(integer_constants::kFP64PositiveInfinity); 60 V8_EXPORT_PRIVATE extern const double kFP64NegativeInfinity = 61 bit_cast<double>(integer_constants::kFP64NegativeInfinity); 62 63 V8_EXPORT_PRIVATE extern const double kFP64SignallingNaN = 64 bit_cast<double>(integer_constants::kFP64SignallingNaN); 65 V8_EXPORT_PRIVATE extern const float kFP32SignallingNaN = 66 bit_cast<float>(integer_constants::kFP32SignallingNaN); 67 68 V8_EXPORT_PRIVATE extern const double kFP64QuietNaN = 69 bit_cast<double>(integer_constants::kFP64QuietNaN); 70 V8_EXPORT_PRIVATE extern const float kFP32QuietNaN = 71 bit_cast<float>(integer_constants::kFP32QuietNaN); 72 73 V8_EXPORT_PRIVATE extern const double kFP64DefaultNaN = 74 bit_cast<double>(integer_constants::kFP64DefaultNaN); 75 V8_EXPORT_PRIVATE extern const float kFP32DefaultNaN = 76 bit_cast<float>(integer_constants::kFP32DefaultNaN); 77 extern const float16 kFP16DefaultNaN = 78 bit_cast<float16>(integer_constants::kFP16DefaultNaN); 79 80 #if defined(V8_OS_WIN) 81 } // end of extern "C" 82 #endif 83 84 } // namespace internal 85 } // namespace v8 86