#include <math.h>
#include <float.h>
Go to the source code of this file.
◆ VARIANT2_INTEGER_MATH_SQRT_FIXUP
| #define VARIANT2_INTEGER_MATH_SQRT_FIXUP |
( |
| r | ) |
|
Value:do { \
r += ((r2 + b > sqrt_input) ? -1 : 0) + ((r2 + (1ULL << 32) < sqrt_input - s) ? 1 : 0); \
} while(0)
unsigned __int64 uint64_t
Definition at line 155 of file variant2_int_sqrt.h.
155#define VARIANT2_INTEGER_MATH_SQRT_FIXUP(r) \
156 do { \
157 const uint64_t s = r >> 1; \
158 const uint64_t b = r & 1; \
159 const uint64_t r2 = (uint64_t)(s) * (s + b) + (r << 32); \
160 r += ((r2 + b > sqrt_input) ? -1 : 0) + ((r2 + (1ULL << 32) < sqrt_input - s) ? 1 : 0); \
161 } while(0)
◆ VARIANT2_INTEGER_MATH_SQRT_STEP_FP64
| #define VARIANT2_INTEGER_MATH_SQRT_STEP_FP64 |
( |
| ) |
|
Value:do { \
sqrt_result = sqrt(sqrt_input + 18446744073709551616.0) * 2.0 - 8589934592.0; \
} while(0)
Definition at line 15 of file variant2_int_sqrt.h.
15#define VARIANT2_INTEGER_MATH_SQRT_STEP_FP64() \
16 do { \
17 sqrt_result = sqrt(sqrt_input + 18446744073709551616.0) * 2.0 - 8589934592.0; \
18 } while(0)
◆ VARIANT2_INTEGER_MATH_SQRT_STEP_REF
| #define VARIANT2_INTEGER_MATH_SQRT_STEP_REF |
( |
| ) |
|
Value:sqrt_result = integer_square_root_v2(sqrt_input)
Definition at line 20 of file variant2_int_sqrt.h.
20#define VARIANT2_INTEGER_MATH_SQRT_STEP_REF() \
21 sqrt_result = integer_square_root_v2(sqrt_input)
◆ VARIANT2_INTEGER_MATH_SQRT_STEP_SSE2
| #define VARIANT2_INTEGER_MATH_SQRT_STEP_SSE2 |
( |
| ) |
|
Value:do { \
const __m128i exp_double_bias = _mm_set_epi64x(0, 1023ULL << 52); \
__m128d x = _mm_castsi128_pd(_mm_add_epi64(_mm_cvtsi64_si128(sqrt_input >> 12), exp_double_bias)); \
x = _mm_sqrt_sd(_mm_setzero_pd(), x); \
sqrt_result = (
uint64_t)(_mm_cvtsi128_si64(_mm_sub_epi64(_mm_castpd_si128(x), exp_double_bias))) >> 19; \
} while(0)
Definition at line 7 of file variant2_int_sqrt.h.
7#define VARIANT2_INTEGER_MATH_SQRT_STEP_SSE2() \
8 do { \
9 const __m128i exp_double_bias = _mm_set_epi64x(0, 1023ULL << 52); \
10 __m128d x = _mm_castsi128_pd(_mm_add_epi64(_mm_cvtsi64_si128(sqrt_input >> 12), exp_double_bias)); \
11 x = _mm_sqrt_sd(_mm_setzero_pd(), x); \
12 sqrt_result = (uint64_t)(_mm_cvtsi128_si64(_mm_sub_epi64(_mm_castpd_si128(x), exp_double_bias))) >> 19; \
13 } while(0)