intrinsic_exponential.hpp

00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2009-05-11
00005 // Updated : 2009-05-11
00006 // Licence : This source is under MIT License
00007 // File    : glm/core/intrinsic_exponential.hpp
00009 
00010 #ifndef glm_detail_intrinsic_exponential
00011 #define glm_detail_intrinsic_exponential
00012 
00013 #include "setup.hpp"
00014 
00015 #if((GLM_ARCH & GLM_ARCH_SSE2) != GLM_ARCH_SSE2)
00016 #       error "SSE2 instructions not supported or enabled"
00017 #else
00018 
00019 namespace glm{
00020 namespace detail
00021 {
00022 /*
00023 inline __m128 sse_rsqrt_nr_ss(__m128 const x)
00024 {
00025         __m128 recip = _mm_rsqrt_ss( x );  // "estimate" opcode
00026         const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast load
00027         const static __m128 half = { 0.5,0.5,0.5,0.5 };
00028         __m128 halfrecip = _mm_mul_ss( half, recip );
00029         __m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) );
00030         return _mm_mul_ss( halfrecip, threeminus_xrr );
00031 }
00032  
00033 inline __m128 sse_normalize_fast_ps(  float * RESTRICT vOut, float * RESTRICT vIn )
00034 {
00035         __m128 x = _mm_load_ss(&vIn[0]);
00036         __m128 y = _mm_load_ss(&vIn[1]);
00037         __m128 z = _mm_load_ss(&vIn[2]);
00038  
00039         const __m128 l =  // compute x*x + y*y + z*z
00040                 _mm_add_ss(
00041                  _mm_add_ss( _mm_mul_ss(x,x),
00042                              _mm_mul_ss(y,y)
00043                             ),
00044                  _mm_mul_ss( z, z )
00045                 );
00046  
00047  
00048         const __m128 rsqt = _mm_rsqrt_nr_ss( l );
00049         _mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) );
00050         _mm_store_ss( &vOut[1] , _mm_mul_ss( rsqt, y ) );
00051         _mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) );
00052  
00053         return _mm_mul_ss( l , rsqt );
00054 }
00055 */
00056 }//namespace detail
00057 }//namespace glm
00058 
00059 #endif//GLM_ARCH
00060 #endif//glm_detail_intrinsic_exponential