1
0

affine.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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_affine_mat_wasm_h
  8. #define cglm_affine_mat_wasm_h
  9. #if defined(__wasm__) && defined(__wasm_simd128__)
  10. #include "../../common.h"
  11. #include "../intrin.h"
  12. CGLM_INLINE
  13. void
  14. glm_mul_wasm(mat4 m1, mat4 m2, mat4 dest) {
  15. /* D = R * L (Column-Major) */
  16. glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
  17. l = glmm_load(m1[0]);
  18. r0 = glmm_load(m2[0]);
  19. r1 = glmm_load(m2[1]);
  20. r2 = glmm_load(m2[2]);
  21. r3 = glmm_load(m2[3]);
  22. v0 = wasm_f32x4_mul(glmm_splat_x(r0), l);
  23. v1 = wasm_f32x4_mul(glmm_splat_x(r1), l);
  24. v2 = wasm_f32x4_mul(glmm_splat_x(r2), l);
  25. v3 = wasm_f32x4_mul(glmm_splat_x(r3), l);
  26. l = glmm_load(m1[1]);
  27. v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
  28. v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
  29. v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
  30. v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
  31. l = glmm_load(m1[2]);
  32. v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
  33. v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
  34. v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
  35. v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
  36. l = glmm_load(m1[3]);
  37. v3 = glmm_fmadd(glmm_splat_w(r3), l, v3);
  38. glmm_store(dest[0], v0);
  39. glmm_store(dest[1], v1);
  40. glmm_store(dest[2], v2);
  41. glmm_store(dest[3], v3);
  42. }
  43. CGLM_INLINE
  44. void
  45. glm_mul_rot_wasm(mat4 m1, mat4 m2, mat4 dest) {
  46. /* D = R * L (Column-Major) */
  47. glmm_128 l, r0, r1, r2, v0, v1, v2;
  48. l = glmm_load(m1[0]);
  49. r0 = glmm_load(m2[0]);
  50. r1 = glmm_load(m2[1]);
  51. r2 = glmm_load(m2[2]);
  52. v0 = wasm_f32x4_mul(glmm_splat_x(r0), l);
  53. v1 = wasm_f32x4_mul(glmm_splat_x(r1), l);
  54. v2 = wasm_f32x4_mul(glmm_splat_x(r2), l);
  55. l = glmm_load(m1[1]);
  56. v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
  57. v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
  58. v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
  59. l = glmm_load(m1[2]);
  60. v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
  61. v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
  62. v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
  63. glmm_store(dest[0], v0);
  64. glmm_store(dest[1], v1);
  65. glmm_store(dest[2], v2);
  66. glmm_store(dest[3], glmm_load(m1[3]));
  67. }
  68. CGLM_INLINE
  69. void
  70. glm_inv_tr_wasm(mat4 mat) {
  71. glmm_128 r0, r1, r2, r3, x0, x1, x2, x3, x4, x5;
  72. r0 = glmm_load(mat[0]);
  73. r1 = glmm_load(mat[1]);
  74. r2 = glmm_load(mat[2]);
  75. r3 = glmm_load(mat[3]);
  76. x1 = wasm_f32x4_const(0.0f, 0.0f, 0.0f, 1.0f);
  77. /* _MM_TRANSPOSE4_PS(r0, r1, r2, x1); */
  78. x2 = wasm_i32x4_shuffle(r0, r1, 0, 4, 1, 5);
  79. x3 = wasm_i32x4_shuffle(r0, r1, 2, 6, 3, 7);
  80. x4 = wasm_i32x4_shuffle(r2, x1, 0, 4, 1, 5);
  81. x5 = wasm_i32x4_shuffle(r2, x1, 2, 6, 3, 7);
  82. /* r0 = _mm_movelh_ps(x2, x4); */
  83. r0 = wasm_i32x4_shuffle(x2, x4, 0, 1, 4, 5);
  84. /* r1 = _mm_movehl_ps(x4, x2); */
  85. r1 = wasm_i32x4_shuffle(x4, x2, 6, 7, 2, 3);
  86. /* r2 = _mm_movelh_ps(x3, x5); */
  87. r2 = wasm_i32x4_shuffle(x3, x5, 0, 1, 4, 5);
  88. /* x1 = _mm_movehl_ps(x5, x3); */
  89. x1 = wasm_i32x4_shuffle(x5, x3, 6, 7, 2, 3);
  90. x2 = glmm_shuff1(r3, 0, 0, 0, 0);
  91. x3 = glmm_shuff1(r3, 1, 1, 1, 1);
  92. x4 = glmm_shuff1(r3, 2, 2, 2, 2);
  93. x0 = glmm_fmadd(r0, x2,
  94. glmm_fmadd(r1, x3, wasm_f32x4_mul(r2, x4)));
  95. x0 = wasm_f32x4_neg(x0);
  96. x0 = wasm_f32x4_add(x0, x1);
  97. glmm_store(mat[0], r0);
  98. glmm_store(mat[1], r1);
  99. glmm_store(mat[2], r2);
  100. glmm_store(mat[3], x0);
  101. }
  102. #endif
  103. #endif /* cglm_affine_mat_wasm_h */