diff --git a/Src/Base/AMReX_Math.H b/Src/Base/AMReX_Math.H index c71459f162..fbf78dabe1 100644 --- a/Src/Base/AMReX_Math.H +++ b/Src/Base/AMReX_Math.H @@ -209,6 +209,19 @@ constexpr T powi (T x) noexcept } } +#if defined(AMREX_INT128_SUPPORTED) +AMREX_GPU_DEVICE AMREX_FORCE_INLINE +std::uint64_t umulhi (std::uint64_t a, std::uint64_t b) +{ +#if defined(AMREX_USE_CUDA) || defined(AMREX_USE_HIP) + return __umul64hi(a, b); +#else + auto tmp = amrex::UInt128_t(a) * amrex::UInt128_t(b); + return std::uint64_t(tmp >> 64); +#endif +} +#endif + /*************************************************************************************************** * Copyright (c) 2017 - 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: BSD-3-Clause @@ -312,11 +325,11 @@ struct FastDivmodU64 AMREX_GPU_HOST_DEVICE std::uint64_t divide (std::uint64_t dividend) const { -#if defined(AMREX_INT128_SUPPORTED) && (defined(AMREX_USE_CUDA) || defined(AMREX_USE_HIP)) +#if defined(AMREX_INT128_SUPPORTED) AMREX_IF_ON_DEVICE(( auto x = dividend; if (multiplier) { - x = __umul64hi(dividend + round_up, multiplier); + x = amrex::Math::umulhi(dividend + round_up, multiplier); } return (x >> shift_right); ))