В float
, кажется, довольно просто floor()
и чем int()
, например:
float z = floor(LOG2EF * x + 0.5f);
const int32_t n = int32_t(z);
становится:
__m128 z = _mm_add_ps(_mm_mul_ps(log2ef, x), half);
__m128 t = _mm_cvtepi32_ps(_mm_cvttps_epi32(z));
z = _mm_sub_ps(t, _mm_and_ps(_mm_cmplt_ps(z, t), one));
__m128i n = _mm_cvtps_epi32(z);
Но как бы вы достиглиэто в double
с использованием только SSE2?
Это двойная версия, которую я хотел бы преобразовать:
double z = floor(LOG2E * x + 0.5);
const int32_t n = int32_t(z);