1
0

mat3.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (c), Recep Aslantas.
  3. *
  4. * MIT License (MIT), http://opensource.org/licenses/MIT
  5. * Full license can be found in the LICENSE file
  6. */
  7. #ifndef cglm_mat3_sse_h
  8. #define cglm_mat3_sse_h
  9. #if defined( __SSE__ ) || defined( __SSE2__ )
  10. #include "../../common.h"
  11. #include "../intrin.h"
  12. CGLM_INLINE
  13. void
  14. glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
  15. __m128 l0, l1, l2, r0, r1, r2, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
  16. l0 = _mm_loadu_ps(m1[0]);
  17. l1 = _mm_loadu_ps(&m1[1][1]);
  18. r0 = _mm_loadu_ps(m2[0]);
  19. r1 = _mm_loadu_ps(&m2[1][1]);
  20. x8 = glmm_shuff1(l0, 0, 2, 1, 0); /* a00 a02 a01 a00 */
  21. x1 = glmm_shuff1(r0, 3, 0, 0, 0); /* b10 b00 b00 b00 */
  22. x2 = _mm_shuffle_ps(l0, l1, _MM_SHUFFLE(1, 0, 3, 3)); /* a12 a11 a10 a10 */
  23. x3 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 0, 3, 1)); /* b20 b11 b10 b01 */
  24. x0 = _mm_mul_ps(x8, x1);
  25. x6 = glmm_shuff1(l0, 1, 0, 2, 1); /* a01 a00 a02 a01 */
  26. x7 = glmm_shuff1(x3, 3, 3, 1, 1); /* b20 b20 b10 b10 */
  27. l2 = _mm_load_ss(&m1[2][2]);
  28. r2 = _mm_load_ss(&m2[2][2]);
  29. x1 = _mm_mul_ps(x6, x7);
  30. l2 = glmm_shuff1(l2, 0, 0, 1, 0); /* a22 a22 0.f a22 */
  31. r2 = glmm_shuff1(r2, 0, 0, 1, 0); /* b22 b22 0.f b22 */
  32. x4 = glmm_shuff1(x2, 0, 3, 2, 0); /* a10 a12 a11 a10 */
  33. x5 = glmm_shuff1(x2, 2, 0, 3, 2); /* a11 a10 a12 a11 */
  34. x6 = glmm_shuff1(x3, 2, 0, 0, 0); /* b11 b01 b01 b01 */
  35. x2 = glmm_shuff1(r1, 3, 3, 0, 0); /* b21 b21 b11 b11 */
  36. x8 = _mm_unpackhi_ps(x8, x4); /* a10 a00 a12 a02 */
  37. x9 = _mm_unpackhi_ps(x7, x2); /* b21 b20 b21 b20 */
  38. x0 = glmm_fmadd(x4, x6, x0);
  39. x1 = glmm_fmadd(x5, x2, x1);
  40. x2 = _mm_movehl_ps(l2, l1); /* a22 a22 a21 a20 */
  41. x3 = glmm_shuff1(x2, 0, 2, 1, 0); /* a20 a22 a21 a20 */
  42. x2 = glmm_shuff1(x2, 1, 0, 2, 1); /* a21 a20 a22 a21 */
  43. x4 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 1, 2, 2)); /* b12 b12 b02 b02 */
  44. x5 = glmm_shuff1(x4, 3, 0, 0, 0); /* b12 b02 b02 b02 */
  45. x4 = _mm_movehl_ps(r2, x4); /* b22 b22 b12 b12 */
  46. x0 = glmm_fmadd(x3, x5, x0);
  47. x1 = glmm_fmadd(x2, x4, x1);
  48. /*
  49. Dot Product : dest[2][2] = a02 * b20 +
  50. a12 * b21 +
  51. a22 * b22 +
  52. 0 * 00 */
  53. x2 = _mm_movelh_ps(x8, l2); /* 0.f a22 a12 a02 */
  54. x3 = _mm_movelh_ps(x9, r2); /* 0.f b22 b21 b20 */
  55. x2 = glmm_vdots(x2, x3);
  56. _mm_storeu_ps(&dest[0][0], x0);
  57. _mm_storeu_ps(&dest[1][1], x1);
  58. _mm_store_ss (&dest[2][2], x2);
  59. }
  60. #endif
  61. #endif /* cglm_mat3_sse_h */