OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_BASE_BITS_H_ | 5 #ifndef V8_BASE_BITS_H_ |
6 #define V8_BASE_BITS_H_ | 6 #define V8_BASE_BITS_H_ |
7 | 7 |
8 #include "include/v8stdint.h" | 8 #include "include/v8stdint.h" |
| 9 #include "src/base/macros.h" |
9 #if V8_CC_MSVC | 10 #if V8_CC_MSVC |
10 #include <intrin.h> | 11 #include <intrin.h> |
11 #endif | 12 #endif |
12 #if V8_OS_WIN32 | 13 #if V8_OS_WIN32 |
13 #include "src/base/win32-headers.h" | 14 #include "src/base/win32-headers.h" |
14 #endif | 15 #endif |
15 | 16 |
16 namespace v8 { | 17 namespace v8 { |
17 namespace base { | 18 namespace base { |
18 namespace bits { | 19 namespace bits { |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 if (shift == 0) return value; | 108 if (shift == 0) return value; |
108 return (value >> shift) | (value << (32 - shift)); | 109 return (value >> shift) | (value << (32 - shift)); |
109 } | 110 } |
110 | 111 |
111 | 112 |
112 inline uint64_t RotateRight64(uint64_t value, uint64_t shift) { | 113 inline uint64_t RotateRight64(uint64_t value, uint64_t shift) { |
113 if (shift == 0) return value; | 114 if (shift == 0) return value; |
114 return (value >> shift) | (value << (64 - shift)); | 115 return (value >> shift) | (value << (64 - shift)); |
115 } | 116 } |
116 | 117 |
| 118 |
| 119 // SignedAddOverflow32(lhs,rhs,val) performs a signed summation of |lhs| and |
| 120 // |rhs| and stores the result into the variable pointed to by |val| and |
| 121 // returns true if the signed summation resulted in an overflow. |
| 122 inline bool SignedAddOverflow32(int32_t lhs, int32_t rhs, int32_t* val) { |
| 123 #if V8_HAS_BUILTIN_SADD_OVERFLOW |
| 124 return __builtin_sadd_overflow(lhs, rhs, val); |
| 125 #else |
| 126 uint32_t res = static_cast<uint32_t>(lhs) + static_cast<uint32_t>(rhs); |
| 127 *val = bit_cast<int32_t>(res); |
| 128 return ((res ^ lhs) & (res ^ rhs) & (1U << 31)) != 0; |
| 129 #endif |
| 130 } |
| 131 |
| 132 |
| 133 // SignedSubOverflow32(lhs,rhs,val) performs a signed subtraction of |lhs| and |
| 134 // |rhs| and stores the result into the variable pointed to by |val| and |
| 135 // returns true if the signed subtraction resulted in an overflow. |
| 136 inline bool SignedSubOverflow32(int32_t lhs, int32_t rhs, int32_t* val) { |
| 137 #if V8_HAS_BUILTIN_SSUB_OVERFLOW |
| 138 return __builtin_ssub_overflow(lhs, rhs, val); |
| 139 #else |
| 140 uint32_t res = static_cast<uint32_t>(lhs) - static_cast<uint32_t>(rhs); |
| 141 *val = bit_cast<int32_t>(res); |
| 142 return ((res ^ lhs) & (res ^ ~rhs) & (1U << 31)) != 0; |
| 143 #endif |
| 144 } |
| 145 |
117 } // namespace bits | 146 } // namespace bits |
118 } // namespace base | 147 } // namespace base |
119 } // namespace v8 | 148 } // namespace v8 |
120 | 149 |
121 #endif // V8_BASE_BITS_H_ | 150 #endif // V8_BASE_BITS_H_ |
OLD | NEW |