| Index: third_party/WebKit/Source/wtf/SaturatedArithmetic.h
|
| diff --git a/third_party/WebKit/Source/wtf/SaturatedArithmetic.h b/third_party/WebKit/Source/wtf/SaturatedArithmetic.h
|
| index bcea3bfa804420edf970af5447e9087c0b723fbf..c85f291660c7d34bd350c9f5dacdc058610e6662 100644
|
| --- a/third_party/WebKit/Source/wtf/SaturatedArithmetic.h
|
| +++ b/third_party/WebKit/Source/wtf/SaturatedArithmetic.h
|
| @@ -31,90 +31,18 @@
|
| #ifndef SaturatedArithmetic_h
|
| #define SaturatedArithmetic_h
|
|
|
| -#include "wtf/CPU.h"
|
| -#include <limits>
|
| -#include <stdint.h>
|
| +#include "base/numerics/saturated_arithmetic.h"
|
|
|
| -#if CPU(ARM) && COMPILER(GCC) && __OPTIMIZE__
|
| +namespace WTF {
|
| +using base::SaturatedAddition;
|
| +using base::SaturatedSubtraction;
|
| +using base::SaturatedNegative;
|
| +using base::SaturatedSet;
|
| +} // namespace WTF
|
|
|
| -// If we're building ARM on GCC we replace the C++ versions with some
|
| -// native ARM assembly for speed.
|
| -#include "wtf/asm/SaturatedArithmeticARM.h"
|
| +using WTF::SaturatedAddition;
|
| +using WTF::SaturatedSubtraction;
|
| +using WTF::SaturatedNegative;
|
| +using WTF::SaturatedSet;
|
|
|
| -#else
|
| -
|
| -ALWAYS_INLINE int32_t saturatedAddition(int32_t a, int32_t b) {
|
| - uint32_t ua = a;
|
| - uint32_t ub = b;
|
| - uint32_t result = ua + ub;
|
| -
|
| - // Can only overflow if the signed bit of the two values match. If the
|
| - // signed bit of the result and one of the values differ it overflowed.
|
| - // The branch compiles to a CMOVNS instruction on x86.
|
| - if (~(ua ^ ub) & (result ^ ua) & (1 << 31))
|
| - return std::numeric_limits<int>::max() + (ua >> 31);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -ALWAYS_INLINE int32_t saturatedSubtraction(int32_t a, int32_t b) {
|
| - uint32_t ua = a;
|
| - uint32_t ub = b;
|
| - uint32_t result = ua - ub;
|
| -
|
| - // Can only overflow if the signed bit of the two input values differ. If
|
| - // the signed bit of the result and the first value differ it overflowed.
|
| - // The branch compiles to a CMOVNS instruction on x86.
|
| - if ((ua ^ ub) & (result ^ ua) & (1 << 31))
|
| - return std::numeric_limits<int>::max() + (ua >> 31);
|
| -
|
| - return result;
|
| -}
|
| -
|
| -ALWAYS_INLINE int32_t saturatedNegative(int32_t a) {
|
| - if (UNLIKELY(a == std::numeric_limits<int>::min()))
|
| - return std::numeric_limits<int>::max();
|
| - return -a;
|
| -}
|
| -
|
| -inline int getMaxSaturatedSetResultForTesting(int FractionalShift) {
|
| - // For C version the set function maxes out to max int, this differs from
|
| - // the ARM asm version, see SaturatedArithmetiARM.h for the equivalent asm
|
| - // version.
|
| - return std::numeric_limits<int>::max();
|
| -}
|
| -
|
| -inline int getMinSaturatedSetResultForTesting(int FractionalShift) {
|
| - return std::numeric_limits<int>::min();
|
| -}
|
| -
|
| -template <int FractionalShift>
|
| -ALWAYS_INLINE int saturatedSet(int value) {
|
| - const int intMaxForLayoutUnit =
|
| - std::numeric_limits<int>::max() >> FractionalShift;
|
| -
|
| - const int intMinForLayoutUnit =
|
| - std::numeric_limits<int>::min() >> FractionalShift;
|
| -
|
| - if (value > intMaxForLayoutUnit)
|
| - return std::numeric_limits<int>::max();
|
| -
|
| - if (value < intMinForLayoutUnit)
|
| - return std::numeric_limits<int>::min();
|
| -
|
| - return value << FractionalShift;
|
| -}
|
| -
|
| -template <int FractionalShift>
|
| -ALWAYS_INLINE int saturatedSet(unsigned value) {
|
| - const unsigned intMaxForLayoutUnit =
|
| - std::numeric_limits<int>::max() >> FractionalShift;
|
| -
|
| - if (value >= intMaxForLayoutUnit)
|
| - return std::numeric_limits<int>::max();
|
| -
|
| - return value << FractionalShift;
|
| -}
|
| -
|
| -#endif // CPU(ARM) && COMPILER(GCC)
|
| #endif // SaturatedArithmetic_h
|
|
|