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