| 158 | |
| 159 | |
| 160 | float Terathon::Sqrt(float x) |
| 161 | { |
| 162 | #ifdef TERATHON_SSE |
| 163 | |
| 164 | float result; |
| 165 | |
| 166 | vec_float v = _mm_load_ss(&x); |
| 167 | vec_float mask = _mm_cmplt_ss(v, VecLoadScalarConstant<0x00800000>()); |
| 168 | |
| 169 | vec_float r = _mm_rsqrt_ss(v); |
| 170 | r = _mm_mul_ss(_mm_sub_ss(VecLoadScalarConstant<0x40400000>(), _mm_mul_ss(v, _mm_mul_ss(r, r))), _mm_mul_ss(r, VecLoadScalarConstant<0x3F000001>())); |
| 171 | |
| 172 | _mm_store_ss(&result, _mm_mul_ss(_mm_andnot_ps(mask, r), v)); |
| 173 | return (result); |
| 174 | |
| 175 | #else |
| 176 | |
| 177 | if (x < Math::min_float) |
| 178 | { |
| 179 | return (0.0F); |
| 180 | } |
| 181 | |
| 182 | uint32 i = 0x5F375A86 - (asuint(x) >> 1); |
| 183 | float r = asfloat(i); |
| 184 | r = (0.5F * r) * (3.0F - x * r * r); |
| 185 | r = (0.5F * r) * (3.0F - x * r * r); |
| 186 | return (r * x); |
| 187 | |
| 188 | #endif |
| 189 | } |
| 190 | |
| 191 | float Terathon::InverseSqrt(float x) |
| 192 | { |
nothing calls this directly
no outgoing calls
no test coverage detected