v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
bits.cc
Go to the documentation of this file.
1// Copyright 2014 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
7#include <limits>
8
9#include "src/base/logging.h"
10
11namespace v8 {
12namespace base {
13namespace bits {
14
15int32_t SignedMulHigh32(int32_t lhs, int32_t rhs) {
16 int64_t const value = static_cast<int64_t>(lhs) * static_cast<int64_t>(rhs);
18 32u);
19}
20
21// The algorithm used is described in section 8.2 of
22// Hacker's Delight, by Henry S. Warren, Jr.
23// It assumes that a right shift on a signed integer is an arithmetic shift.
24int64_t SignedMulHigh64(int64_t u, int64_t v) {
25 uint64_t u0 = u & 0xFFFFFFFF;
26 int64_t u1 = u >> 32;
27 uint64_t v0 = v & 0xFFFFFFFF;
28 int64_t v1 = v >> 32;
29
30 uint64_t w0 = u0 * v0;
31 int64_t t = u1 * v0 + (w0 >> 32);
32 int64_t w1 = t & 0xFFFFFFFF;
33 int64_t w2 = t >> 32;
34 w1 = u0 * v1 + w1;
35
36 return u1 * v1 + w2 + (w1 >> 32);
37}
38
39// The algorithm used is described in section 8.2 of
40// Hacker's Delight, by Henry S. Warren, Jr.
41uint64_t UnsignedMulHigh64(uint64_t u, uint64_t v) {
42 uint64_t u0 = u & 0xFFFFFFFF;
43 uint64_t u1 = u >> 32;
44 uint64_t v0 = v & 0xFFFFFFFF;
45 uint64_t v1 = v >> 32;
46
47 uint64_t w0 = u0 * v0;
48 uint64_t t = u1 * v0 + (w0 >> 32);
49 uint64_t w1 = t & 0xFFFFFFFFLL;
50 uint64_t w2 = t >> 32;
51 w1 = u0 * v1 + w1;
52
53 return u1 * v1 + w2 + (w1 >> 32);
54}
55
56uint32_t UnsignedMulHigh32(uint32_t lhs, uint32_t rhs) {
57 uint64_t const value =
58 static_cast<uint64_t>(lhs) * static_cast<uint64_t>(rhs);
59 return static_cast<uint32_t>(value >> 32u);
60}
61
62int32_t SignedMulHighAndAdd32(int32_t lhs, int32_t rhs, int32_t acc) {
66}
67
68
69int32_t SignedDiv32(int32_t lhs, int32_t rhs) {
70 if (rhs == 0) return 0;
71 if (rhs == -1) return lhs == std::numeric_limits<int32_t>::min() ? lhs : -lhs;
72 return lhs / rhs;
73}
74
75int64_t SignedDiv64(int64_t lhs, int64_t rhs) {
76 if (rhs == 0) return 0;
77 if (rhs == -1) return lhs == std::numeric_limits<int64_t>::min() ? lhs : -lhs;
78 return lhs / rhs;
79}
80
81int32_t SignedMod32(int32_t lhs, int32_t rhs) {
82 if (rhs == 0 || rhs == -1) return 0;
83 return lhs % rhs;
84}
85
86int64_t SignedMod64(int64_t lhs, int64_t rhs) {
87 if (rhs == 0 || rhs == -1) return 0;
88 return lhs % rhs;
89}
90
91int64_t SignedSaturatedAdd64(int64_t lhs, int64_t rhs) {
92 using limits = std::numeric_limits<int64_t>;
93 // Underflow if {lhs + rhs < min}. In that case, return {min}.
94 if (rhs < 0 && lhs < limits::min() - rhs) return limits::min();
95 // Overflow if {lhs + rhs > max}. In that case, return {max}.
96 if (rhs >= 0 && lhs > limits::max() - rhs) return limits::max();
97 return lhs + rhs;
98}
99
100int64_t SignedSaturatedSub64(int64_t lhs, int64_t rhs) {
101 using limits = std::numeric_limits<int64_t>;
102 // Underflow if {lhs - rhs < min}. In that case, return {min}.
103 if (rhs > 0 && lhs < limits::min() + rhs) return limits::min();
104 // Overflow if {lhs - rhs > max}. In that case, return {max}.
105 if (rhs <= 0 && lhs > limits::max() + rhs) return limits::max();
106 return lhs - rhs;
107}
108
109} // namespace bits
110} // namespace base
111} // namespace v8
int32_t SignedMulHighAndAdd32(int32_t lhs, int32_t rhs, int32_t acc)
Definition bits.cc:62
int32_t SignedMulHigh32(int32_t lhs, int32_t rhs)
Definition bits.cc:15
int32_t SignedDiv32(int32_t lhs, int32_t rhs)
Definition bits.cc:69
int64_t SignedDiv64(int64_t lhs, int64_t rhs)
Definition bits.cc:75
uint32_t UnsignedMulHigh32(uint32_t lhs, uint32_t rhs)
Definition bits.cc:56
int64_t SignedMulHigh64(int64_t u, int64_t v)
Definition bits.cc:24
int64_t SignedMod64(int64_t lhs, int64_t rhs)
Definition bits.cc:86
int32_t SignedMod32(int32_t lhs, int32_t rhs)
Definition bits.cc:81
int64_t SignedSaturatedSub64(int64_t lhs, int64_t rhs)
Definition bits.cc:100
uint64_t UnsignedMulHigh64(uint64_t u, uint64_t v)
Definition bits.cc:41
int64_t SignedSaturatedAdd64(int64_t lhs, int64_t rhs)
Definition bits.cc:91
V8_INLINE Dest bit_cast(Source const &source)
Definition macros.h:95