v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
utils-arm64.cc
Go to the documentation of this file.
1// Copyright 2013 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 "src/base/bits.h"
6#if V8_TARGET_ARCH_ARM64
7
9
10namespace v8 {
11namespace internal {
12
13#define __ assm->
14
15uint32_t float_sign(float val) {
16 uint32_t bits = base::bit_cast<uint32_t>(val);
17 return unsigned_bitextract_32(31, 31, bits);
18}
19
20uint32_t float_exp(float val) {
21 uint32_t bits = base::bit_cast<uint32_t>(val);
22 return unsigned_bitextract_32(30, 23, bits);
23}
24
25uint32_t float_mantissa(float val) {
26 uint32_t bits = base::bit_cast<uint32_t>(val);
27 return unsigned_bitextract_32(22, 0, bits);
28}
29
30uint32_t double_sign(double val) {
31 uint64_t bits = base::bit_cast<uint64_t>(val);
32 return static_cast<uint32_t>(unsigned_bitextract_64(63, 63, bits));
33}
34
35uint32_t double_exp(double val) {
36 uint64_t bits = base::bit_cast<uint64_t>(val);
37 return static_cast<uint32_t>(unsigned_bitextract_64(62, 52, bits));
38}
39
40uint64_t double_mantissa(double val) {
41 uint64_t bits = base::bit_cast<uint64_t>(val);
42 return unsigned_bitextract_64(51, 0, bits);
43}
44
45float float_pack(uint32_t sign, uint32_t exp, uint32_t mantissa) {
46 uint32_t bits = sign << kFloatExponentBits | exp;
47 return base::bit_cast<float>((bits << kFloatMantissaBits) | mantissa);
48}
49
50double double_pack(uint64_t sign, uint64_t exp, uint64_t mantissa) {
51 uint64_t bits = sign << kDoubleExponentBits | exp;
52 return base::bit_cast<double>((bits << kDoubleMantissaBits) | mantissa);
53}
54
55int float16classify(float16 value) {
56 const uint16_t exponent_max = (1 << kFloat16ExponentBits) - 1;
57 const uint16_t exponent_mask = exponent_max << kFloat16MantissaBits;
58 const uint16_t mantissa_mask = (1 << kFloat16MantissaBits) - 1;
59
60 const uint16_t exponent = (value & exponent_mask) >> kFloat16MantissaBits;
61 const uint16_t mantissa = value & mantissa_mask;
62 if (exponent == 0) {
63 if (mantissa == 0) {
64 return FP_ZERO;
65 }
66 return FP_SUBNORMAL;
67 } else if (exponent == exponent_max) {
68 if (mantissa == 0) {
69 return FP_INFINITE;
70 }
71 return FP_NAN;
72 }
73 return FP_NORMAL;
74}
75
76int CountLeadingSignBits(int64_t value, int width) {
77 DCHECK(base::bits::IsPowerOfTwo(width) && (width <= 64));
78 if (value >= 0) {
79 return CountLeadingZeros(value, width) - 1;
80 } else {
81 return CountLeadingZeros(~value, width) - 1;
82 }
83}
84
85int CountSetBits(uint64_t value, int width) {
86 DCHECK((width == 32) || (width == 64));
87 if (width == 64) {
88 return static_cast<int>(base::bits::CountPopulation(value));
89 }
90 return static_cast<int>(
91 base::bits::CountPopulation(static_cast<uint32_t>(value & 0xFFFFFFFFF)));
92}
93
94int LowestSetBitPosition(uint64_t value) {
95 DCHECK_NE(value, 0U);
96 return base::bits::CountTrailingZeros(value) + 1;
97}
98
99int HighestSetBitPosition(uint64_t value) {
100 DCHECK_NE(value, 0U);
101 return 63 - CountLeadingZeros(value, 64);
102}
103
104int MaskToBit(uint64_t mask) {
105 DCHECK_EQ(CountSetBits(mask, 64), 1);
107}
108
109#undef __
110
111} // namespace internal
112} // namespace v8
113
114#endif // V8_TARGET_ARCH_ARM64
uint32_t const mask
unsigned short uint16_t
Definition unicode.cc:39
constexpr unsigned CountTrailingZeros(T value)
Definition bits.h:144
constexpr unsigned CountPopulation(T value)
Definition bits.h:26
constexpr bool IsPowerOfTwo(T value)
Definition bits.h:187
double exp(double x)
Definition ieee754.cc:1447
V8_INLINE Dest bit_cast(Source const &source)
Definition macros.h:95
int CountLeadingSignBits(int64_t value, int width)
V8_EXPORT_PRIVATE int CountSetBits(uint64_t value, int width)
int LowestSetBitPosition(uint64_t value)
constexpr unsigned kFloat16ExponentBits
constexpr unsigned kFloatMantissaBits
int MaskToBit(uint64_t mask)
uint32_t float_sign(float val)
constexpr unsigned kDoubleMantissaBits
constexpr unsigned kFloatExponentBits
int HighestSetBitPosition(uint64_t value)
constexpr int U
uint32_t double_sign(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)
constexpr unsigned kFloat16MantissaBits
int float16classify(float16 value)
uint32_t float_mantissa(float val)
uint32_t double_exp(double val)
uint32_t float_exp(float val)
uint64_t double_mantissa(double val)
uint64_t unsigned_bitextract_64(int msb, int lsb, uint64_t x)
Definition utils.h:559
static int CountLeadingZeros(uint64_t value, int width)
Definition utils-arm64.h:34
constexpr unsigned kDoubleExponentBits
uint32_t unsigned_bitextract_32(int msb, int lsb, uint32_t x)
Definition utils.h:555
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485