9#if defined(VECMAT_USE_F64)
14 const __m256d a0 = _mm256_loadu_pd(&a->
v[0]);
15 const __m256d a1 = _mm256_loadu_pd(&a->
v[4]);
16 const __m256d a2 = _mm256_loadu_pd(&a->
v[8]);
17 const __m256d a3 = _mm256_loadu_pd(&a->
v[12]);
18 for (
int c = 0; c < 4; c++) {
19 __m256d col = _mm256_mul_pd(a0, _mm256_set1_pd(b->
v[c * 4 + 0]));
20 col = _mm256_add_pd(col, _mm256_mul_pd(a1, _mm256_set1_pd(b->
v[c * 4 + 1])));
21 col = _mm256_add_pd(col, _mm256_mul_pd(a2, _mm256_set1_pd(b->
v[c * 4 + 2])));
22 col = _mm256_add_pd(col, _mm256_mul_pd(a3, _mm256_set1_pd(b->
v[c * 4 + 3])));
23 _mm256_storeu_pd(&tmp.
v[c * 4], col);
25 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
30 __m256d r0 = _mm256_loadu_pd(&m->
v[0]);
31 __m256d r1 = _mm256_loadu_pd(&m->
v[4]);
32 __m256d r2 = _mm256_loadu_pd(&m->
v[8]);
33 __m256d r3 = _mm256_loadu_pd(&m->
v[12]);
35 __m256d t0 = _mm256_unpacklo_pd(r0, r1);
36 __m256d t1 = _mm256_unpackhi_pd(r0, r1);
37 __m256d t2 = _mm256_unpacklo_pd(r2, r3);
38 __m256d t3 = _mm256_unpackhi_pd(r2, r3);
40 r0 = _mm256_permute2f128_pd(t0, t2, 0x20);
41 r1 = _mm256_permute2f128_pd(t1, t3, 0x20);
42 r2 = _mm256_permute2f128_pd(t0, t2, 0x31);
43 r3 = _mm256_permute2f128_pd(t1, t3, 0x31);
46 _mm256_storeu_pd(&tmp.
v[0], r0);
47 _mm256_storeu_pd(&tmp.
v[4], r1);
48 _mm256_storeu_pd(&tmp.
v[8], r2);
49 _mm256_storeu_pd(&tmp.
v[12], r3);
50 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
55 __m256d r = _mm256_mul_pd(_mm256_loadu_pd(&m->
v[0]), _mm256_set1_pd(v->
x));
56 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[4]), _mm256_set1_pd(v->
y)));
57 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[8]), _mm256_set1_pd(v->
z)));
58 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[12]), _mm256_set1_pd(v->
w)));
59 _mm256_storeu_pd(res->
v, r);
64 __m256d r = _mm256_mul_pd(_mm256_loadu_pd(&m->
v[0]), _mm256_set1_pd(v->
x));
65 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[4]), _mm256_set1_pd(v->
y)));
66 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[8]), _mm256_set1_pd(v->
z)));
67 r = _mm256_add_pd(r, _mm256_mul_pd(_mm256_loadu_pd(&m->
v[12]), _mm256_set1_pd(w)));
69 _mm256_storeu_pd(t, r);
80 const __m128 a0 = _mm_loadu_ps(&a->
v[0]);
81 const __m128 a1 = _mm_loadu_ps(&a->
v[4]);
82 const __m128 a2 = _mm_loadu_ps(&a->
v[8]);
83 const __m128 a3 = _mm_loadu_ps(&a->
v[12]);
84 for (
int c = 0; c < 4; c++) {
85 __m128 col = _mm_mul_ps(a0, _mm_set1_ps(b->
v[c * 4 + 0]));
86 col = _mm_add_ps(col, _mm_mul_ps(a1, _mm_set1_ps(b->
v[c * 4 + 1])));
87 col = _mm_add_ps(col, _mm_mul_ps(a2, _mm_set1_ps(b->
v[c * 4 + 2])));
88 col = _mm_add_ps(col, _mm_mul_ps(a3, _mm_set1_ps(b->
v[c * 4 + 3])));
89 _mm_storeu_ps(&tmp.
v[c * 4], col);
91 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
96 __m128 c0 = _mm_loadu_ps(&m->
v[0]);
97 __m128 c1 = _mm_loadu_ps(&m->
v[4]);
98 __m128 c2 = _mm_loadu_ps(&m->
v[8]);
99 __m128 c3 = _mm_loadu_ps(&m->
v[12]);
100 _MM_TRANSPOSE4_PS(c0, c1, c2, c3);
102 _mm_storeu_ps(&tmp.
v[0], c0);
103 _mm_storeu_ps(&tmp.
v[4], c1);
104 _mm_storeu_ps(&tmp.
v[8], c2);
105 _mm_storeu_ps(&tmp.
v[12], c3);
106 memcpy(res->
v, tmp.
v,
sizeof(tmp.
v));
111 __m128 r = _mm_mul_ps(_mm_loadu_ps(&m->
v[0]), _mm_set1_ps(v->
x));
112 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[4]), _mm_set1_ps(v->
y)));
113 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[8]), _mm_set1_ps(v->
z)));
114 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[12]), _mm_set1_ps(v->
w)));
115 _mm_storeu_ps(res->
v, r);
120 __m128 r = _mm_mul_ps(_mm_loadu_ps(&m->
v[0]), _mm_set1_ps(v->
x));
121 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[4]), _mm_set1_ps(v->
y)));
122 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[8]), _mm_set1_ps(v->
z)));
123 r = _mm_add_ps(r, _mm_mul_ps(_mm_loadu_ps(&m->
v[12]), _mm_set1_ps(w)));
void mat4_mul_vec4_ptr_avx(vector4 *res, const matrix4 *m, const vector4 *v)
void mat4_transpose_ptr_avx(matrix4 *res, const matrix4 *m)
void mat4_mul_vec3_ptr_avx(vector3 *res, const matrix4 *m, const vector3 *v, const vm_float_t w)
void mat4_mul_ptr_avx(matrix4 *res, const matrix4 *a, const matrix4 *b)
vm_float_t v[VECMAT_MAT4_SIZE]
vm_float_t v[VECMAT_VEC4_SIZE]