10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
36 #ifdef EIGEN_GPU_COMPILE_PHASE
38 #elif defined(SYCL_DEVICE_ONLY)
42 _BitScanReverse(&index,
val);
52 #ifdef EIGEN_GPU_COMPILE_PHASE
54 #elif defined(SYCL_DEVICE_ONLY)
56 #elif EIGEN_COMP_MSVC && EIGEN_ARCH_x86_64
58 _BitScanReverse64(&index,
val);
62 unsigned int lo = (
unsigned int)(
val & 0xffffffff);
63 unsigned int hi = (
unsigned int)((
val >> 32) & 0xffffffff);
66 n = 32 + count_leading_zeros<unsigned int>(lo);
68 n = count_leading_zeros<unsigned int>(hi);
84 static constexpr
int N =
sizeof(
T) * 8;
89 #if defined(EIGEN_GPU_COMPILE_PHASE)
90 return __umulhi(
a,
b);
91 #elif defined(SYCL_DEVICE_ONLY)
92 return cl::sycl::mul_hi(
a,
static_cast<uint32_t>(
b));
100 #if defined(EIGEN_GPU_COMPILE_PHASE)
101 return __umul64hi(
a,
b);
102 #elif defined(SYCL_DEVICE_ONLY)
103 return cl::sycl::mul_hi(
a,
static_cast<uint64_t>(
b));
104 #elif EIGEN_COMP_MSVC && (EIGEN_ARCH_x86_64 || EIGEN_ARCH_ARM64)
106 #elif EIGEN_HAS_BUILTIN_INT128
107 __uint128_t
v =
static_cast<__uint128_t
>(
a) *
static_cast<__uint128_t
>(
b);
114 template <
int N,
typename T>
118 return static_cast<uint32_t>((
static_cast<uint64_t>(1) << (
N + log_div)) / divider -
123 template <
typename T>
126 #if EIGEN_HAS_BUILTIN_INT128 && !defined(EIGEN_GPU_COMPILE_PHASE) && !defined(SYCL_DEVICE_ONLY)
127 return static_cast<uint64_t>((
static_cast<__uint128_t
>(1) << (64 + log_div)) /
static_cast<__uint128_t
>(divider) -
128 (
static_cast<__uint128_t
>(1) << 64) + 1);
130 const uint64_t shift = 1ULL << log_div;
134 return static_cast<uint64_t>(result);
139 template <
typename T,
bool div_gt_one = false>
158 int log_div =
N - leading_zeros;
165 shift1 = log_div > 1 ? 1 : log_div;
166 shift2 = log_div > 1 ? log_div - 1 : 0;
204 #ifdef EIGEN_GPU_COMPILE_PHASE
205 return (__umulhi(magic,
n) >> shift);
206 #elif defined(SYCL_DEVICE_ONLY)
207 return (cl::sycl::mul_hi(magic,
static_cast<uint32_t>(
n)) >> shift);
210 return (
static_cast<uint32_t>(
v >> 32) >> shift);
218 const unsigned two31 = 0x80000000;
220 unsigned t = two31 + (ad >> 31);
221 unsigned anc =
t - 1 -
t % ad;
223 unsigned q1 = two31 / anc;
224 unsigned r1 = two31 - q1 * anc;
225 unsigned q2 = two31 / ad;
226 unsigned r2 = two31 - q2 * ad;
243 }
while (q1 <
delta || (q1 ==
delta && r1 == 0));
253 template <
typename T,
bool div_gt_one>
255 return divisor.
divide(numerator);
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_ALWAYS_INLINE
Definition: Macros.h:845
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
EIGEN_DEVICE_FUNC void calcMagic(int32_t d)
Definition: TensorIntDiv.h:217
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor()
Definition: TensorIntDiv.h:193
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE int divide(const int32_t n) const
Definition: TensorIntDiv.h:203
EIGEN_DEVICE_FUNC TensorIntDivisor(int32_t divider)
Definition: TensorIntDiv.h:198
int32_t shift
Definition: TensorIntDiv.h:250
uint32_t magic
Definition: TensorIntDiv.h:249
@ N
Definition: constructor.cpp:22
const Scalar * a
Definition: level2_cplx_impl.h:32
EIGEN_DEVICE_FUNC int clz(BitsType bits)
Definition: MathFunctions.h:644
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator/(const T &numerator, const TensorIntDivisor< T, div_gt_one > &divisor)
Definition: TensorIntDiv.h:254
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t muluh(const uint32_t a, const T b)
Definition: TensorIntDiv.h:88
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t< sizeof(T)==4, int > count_leading_zeros(const T val)
Definition: TensorIntDiv.h:35
std::int32_t int32_t
Definition: Meta.h:41
std::uint32_t uint32_t
Definition: Meta.h:40
std::uint64_t uint64_t
Definition: Meta.h:42
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
int delta
Definition: MultiOpt.py:96
val
Definition: calibrate.py:119
Definition: Eigen_Colamd.h:49
t
Definition: plotPSD.py:36
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t computeMultiplier(const int log_div, const T divider)
Definition: TensorIntDiv.h:125
Definition: TensorIntDiv.h:115
static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t computeMultiplier(const int log_div, const T divider)
Definition: TensorIntDiv.h:116
Definition: TensorIntDiv.h:82
UnsignedTraits< T >::type type
Definition: TensorIntDiv.h:83
static constexpr int N
Definition: TensorIntDiv.h:84
Definition: TensorIntDiv.h:140
int32_t shift2
Definition: TensorIntDiv.h:184
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor(const T divider)
Definition: TensorIntDiv.h:151
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor()
Definition: TensorIntDiv.h:142
int32_t shift1
Definition: TensorIntDiv.h:183
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T divide(const T numerator) const
Definition: TensorIntDiv.h:171
DividerTraits< T >::type UnsignedType
Definition: TensorIntDiv.h:181
UnsignedType multiplier
Definition: TensorIntDiv.h:182
Definition: TensorUInt128.h:34
Definition: TensorIntDiv.h:77
std::conditional_t< sizeof(T)==8, uint64_t, uint32_t > type
Definition: TensorIntDiv.h:78
Definition: TensorUInt128.h:20