Advertisement
Ember

SinCos

Mar 14th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. Vector2<Vector> VFunction Vector::SinCos(const Vector& angles)
  2. {
  3.     Vector2<Vector> results;
  4.     // Force the value within the bounds of pi
  5.     Vector x = Vector::ModAngles(angles);
  6.  
  7.     // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x).
  8.     Vector sign = _mm_and_ps(x, Vector::Constant::NegativeZero);
  9.     __m128 c = _mm_or_ps(Vector::Constant::Pi, sign);  // pi when x >= 0, -pi when x < 0
  10.     __m128 absx = _mm_andnot_ps(sign, x);  // |x|
  11.     __m128 rflx = _mm_sub_ps(c, x);
  12.     __m128 comp = _mm_cmple_ps(absx, Vector::Constant::HalfPi);
  13.     __m128 select0 = _mm_and_ps(comp, x);
  14.     __m128 select1 = _mm_andnot_ps(comp, rflx);
  15.     x = _mm_or_ps(select0, select1);
  16.     select0 = _mm_and_ps(comp, Vector::Constant::One);
  17.     select1 = _mm_andnot_ps(comp, Vector::Constant::NegativeOne);
  18.     sign = _mm_or_ps(select0, select1);
  19.  
  20.     __m128 x2 = _mm_mul_ps(x, x);
  21.  
  22.     // Compute polynomial approximation of sine
  23.     const Vector SC1 = Vector::Constant::SinCoefficients1;
  24.     Vector vConstants = Vector::Permute<0, 0, 0, 0>(SC1);
  25.     __m128 Result = _mm_mul_ps(vConstants, x2);
  26.  
  27.     const Vector SC0 = Vector::Constant::SinCoefficients0;
  28.     vConstants = Vector::Permute<3, 3, 3, 3>(SC0);
  29.     Result = _mm_add_ps(Result, vConstants);
  30.     Result = _mm_mul_ps(Result, x2);
  31.  
  32.     vConstants = Vector::Permute<2, 2, 2, 2>(SC0);
  33.     Result = _mm_add_ps(Result, vConstants);
  34.     Result = _mm_mul_ps(Result, x2);
  35.  
  36.     vConstants = Vector::Permute<1, 1, 1, 1>(SC0);
  37.     Result = _mm_add_ps(Result, vConstants);
  38.     Result = _mm_mul_ps(Result, x2);
  39.  
  40.     vConstants = Vector::Permute<0, 0, 0, 0>(SC0);
  41.     Result = _mm_add_ps(Result, vConstants);
  42.     Result = _mm_mul_ps(Result, x2);
  43.     Result = _mm_add_ps(Result, Vector::Constant::One);
  44.     Result = _mm_mul_ps(Result, x);
  45.     //*pSin = Result;
  46.     results.x = Result;
  47.  
  48.     // Compute polynomial approximation of cosine
  49.     const Vector CC1 = Vector::Constant::CosCoefficients1;
  50.     vConstants = Vector::Permute<0, 0, 0, 0>(CC1);
  51.     Result = _mm_mul_ps(vConstants, x2);
  52.  
  53.     const Vector CC0 = Vector::Constant::CosCoefficients0;
  54.     vConstants = Vector::Permute<3, 3, 3, 3>(CC0);
  55.     Result = _mm_add_ps(Result, vConstants);
  56.     Result = _mm_mul_ps(Result, x2);
  57.  
  58.     vConstants = Vector::Permute<2, 2, 2, 2>(CC0);
  59.     Result = _mm_add_ps(Result, vConstants);
  60.     Result = _mm_mul_ps(Result, x2);
  61.  
  62.     vConstants = Vector::Permute<1, 1, 1, 1>(CC0);
  63.     Result = _mm_add_ps(Result, vConstants);
  64.     Result = _mm_mul_ps(Result, x2);
  65.  
  66.     vConstants = Vector::Permute<0, 0, 0, 0>(CC0);
  67.     Result = _mm_add_ps(Result, vConstants);
  68.     Result = _mm_mul_ps(Result, x2);
  69.     Result = _mm_add_ps(Result, Vector::Constant::One);
  70.     Result = _mm_mul_ps(Result, sign);
  71.     //*pCos = Result;
  72.     results.y = Result;
  73.  
  74.     return results;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement