chromium/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc

//
// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// This file contains :int128 implementation details that depend on internal
// representation when ABSL_HAVE_INTRINSIC_INT128 is defined. This file is
// included by int128.h and relies on ABSL_INTERNAL_WCHAR_T being defined.

namespace int128_internal {

// Casts from unsigned to signed while preserving the underlying binary
// representation.
constexpr __int128 BitCastToSigned(unsigned __int128 v) {}

}  // namespace int128_internal

inline int128& int128::operator=(__int128 v) {}

constexpr uint64_t Int128Low64(int128 v) {}

constexpr int64_t Int128High64(int128 v) {}

constexpr int128::int128(int64_t high, uint64_t low)
    // Initially cast to unsigned to prevent a left shift that overflows.
    :{}


constexpr int128::int128(int v) :{}

constexpr int128::int128(long v) :{}       // NOLINT(runtime/int)

constexpr int128::int128(long long v) :{}  // NOLINT(runtime/int)

constexpr int128::int128(__int128 v) :{}

constexpr int128::int128(unsigned int v) :{}

constexpr int128::int128(unsigned long v) :{}  // NOLINT(runtime/int)

// NOLINTNEXTLINE(runtime/int)
constexpr int128::int128(unsigned long long v) :{}

constexpr int128::int128(unsigned __int128 v) :{}

inline int128::int128(float v) {}

inline int128::int128(double v) {}

inline int128::int128(long double v) {}

constexpr int128::int128(uint128 v) :{}

operator bool()

operator char()

operator signed char()

operator unsigned char()

operator char16_t()

operator char32_t()

operator wchar_t()

operator short()

operator unsigned short()

operator int()

operator unsigned int()

operator long()

operator unsigned long()

operator long long()

operator unsigned long long()

operator __int128()

operator unsigned __int128()

// Clang on PowerPC sometimes produces incorrect __int128 to floating point
// conversions. In that case, we do the conversion with a similar implementation
// to the conversion operators in int128_no_intrinsic.inc.
#if defined(__clang__) && !defined(__ppc64__)
operator float()

operator double()

operator long double()

#else  // Clang on PowerPC

inline int128::operator float() const {
  // We must convert the absolute value and then negate as needed, because
  // floating point types are typically sign-magnitude. Otherwise, the
  // difference between the high and low 64 bits when interpreted as two's
  // complement overwhelms the precision of the mantissa.
  //
  // Also check to make sure we don't negate Int128Min()
  return v_ < 0 && *this != Int128Min()
             ? -static_cast<float>(-*this)
             : static_cast<float>(Int128Low64(*this)) +
                   std::ldexp(static_cast<float>(Int128High64(*this)), 64);
}

inline int128::operator double() const {
  // See comment in int128::operator float() above.
  return v_ < 0 && *this != Int128Min()
             ? -static_cast<double>(-*this)
             : static_cast<double>(Int128Low64(*this)) +
                   std::ldexp(static_cast<double>(Int128High64(*this)), 64);
}

inline int128::operator long double() const {
  // See comment in int128::operator float() above.
  return v_ < 0 && *this != Int128Min()
             ? -static_cast<long double>(-*this)
             : static_cast<long double>(Int128Low64(*this)) +
                   std::ldexp(static_cast<long double>(Int128High64(*this)),
                              64);
}
#endif  // Clang on PowerPC

// Comparison operators.

constexpr bool operator==(int128 lhs, int128 rhs) {}

constexpr bool operator!=(int128 lhs, int128 rhs) {}

constexpr bool operator<(int128 lhs, int128 rhs) {}

constexpr bool operator>(int128 lhs, int128 rhs) {}

constexpr bool operator<=(int128 lhs, int128 rhs) {}

constexpr bool operator>=(int128 lhs, int128 rhs) {}

#ifdef __cpp_impl_three_way_comparison
constexpr absl::strong_ordering operator<=>(int128 lhs, int128 rhs) {}
#endif

// Unary operators.

constexpr int128 operator-(int128 v) {}

constexpr bool operator!(int128 v) {}

constexpr int128 operator~(int128 val) {}

// Arithmetic operators.

constexpr int128 operator+(int128 lhs, int128 rhs) {}

constexpr int128 operator-(int128 lhs, int128 rhs) {}

inline int128 operator*(int128 lhs, int128 rhs) {}

inline int128 operator/(int128 lhs, int128 rhs) {}

inline int128 operator%(int128 lhs, int128 rhs) {}

inline int128 int128::operator++(int) {}

inline int128 int128::operator--(int) {}

inline int128& int128::operator++() {}

inline int128& int128::operator--() {}

constexpr int128 operator|(int128 lhs, int128 rhs) {}

constexpr int128 operator&(int128 lhs, int128 rhs) {}

constexpr int128 operator^(int128 lhs, int128 rhs) {}

constexpr int128 operator<<(int128 lhs, int amount) {}

constexpr int128 operator>>(int128 lhs, int amount) {}