diff options
Diffstat (limited to 'indra/llmath/llvector4a.inl')
| -rw-r--r-- | indra/llmath/llvector4a.inl | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl index 443a46c317..0f7c4123ac 100644 --- a/indra/llmath/llvector4a.inl +++ b/indra/llmath/llvector4a.inl @@ -351,8 +351,13 @@ inline void LLVector4a::normalize3()      LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );      // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }      const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ); +#if _M_ARM64 +    static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}}; +    static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f }}; +#else      static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };      static const LLQuad three = {3.f, 3.f, 3.f, 3.f }; +#endif      // Now we do one round of Newton-Raphson approximation to get full accuracy      // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))      // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3)) @@ -375,8 +380,13 @@ inline void LLVector4a::normalize4()      LLVector4a lenSqrd; lenSqrd.setAllDot4( *this, *this );      // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }      const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ); +#if _M_ARM64 +    static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}}; +    static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f}}; +#else      static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };      static const LLQuad three = {3.f, 3.f, 3.f, 3.f }; +#endif      // Now we do one round of Newton-Raphson approximation to get full accuracy      // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))      // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3)) @@ -399,8 +409,13 @@ inline LLSimdScalar LLVector4a::normalize3withLength()      LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );      // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }      const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ); +#if _M_ARM64 +    static const LLQuad half = {.n128_f32 = {0.5f, 0.5f, 0.5f, 0.5f}}; +    static const LLQuad three = {.n128_f32 = {3.f, 3.f, 3.f, 3.f}}; +#else      static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };      static const LLQuad three = {3.f, 3.f, 3.f, 3.f }; +#endif      // Now we do one round of Newton-Raphson approximation to get full accuracy      // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))      // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))  | 
