From ab9c6c0f633b3ccfa7ce93e6eb01ad2dd8752199 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 9 Sep 2024 20:16:25 +0200 Subject: [PATCH] Use SSE2 for the sqrt as the other thing is super slow --- src/rendering/hwrenderer/scene/hw_clipper.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/rendering/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp index 09031f8d4..14062e5cd 100644 --- a/src/rendering/hwrenderer/scene/hw_clipper.cpp +++ b/src/rendering/hwrenderer/scene/hw_clipper.cpp @@ -39,6 +39,11 @@ #include "g_levellocals.h" #include "basics.h" +#if defined(__SSE2__) || defined(_M_X64) +#include +#define USE_SSE2 +#endif + //----------------------------------------------------------------------------- // // RemoveRange @@ -433,7 +438,17 @@ angle_t Clipper::PointToPseudoPitch(double x, double y, double z) } else { +#ifdef USE_SSE2 + __m128 mvecx = _mm_set_ss(vecx); + __m128 mvecy = _mm_set_ss(vecy); + __m128 mvecz = _mm_set_ss(vecz); + __m128 dot = _mm_add_ss(_mm_mul_ss(mvecx, mvecx), _mm_mul_ss(mvecy, mvecy)); + __m128 notsignbit = _mm_castsi128_ps(_mm_cvtsi32_si128(~(1 << 31))); + __m128 fabsvecz = _mm_and_ps(mvecz, notsignbit); + double result = _mm_cvtss_f32((_mm_div_ss(mvecz, _mm_add_ss(_mm_sqrt_ss(dot), fabsvecz)))); +#else double result = vecz / (g_sqrt(vecx*vecx + vecy*vecy) + fabs(vecz)); // -ffast-math compile flag applies to this file, yes? +#endif if ((vecx * viewpoint->TanCos + vecy * viewpoint->TanSin) <= 0.0) // Point is behind viewpoint { result = 2.0 - result;