master
ブランチ master
VulkanExample / dep / include / glm / simd / matrix.h
40.4 KB、1040行 生 Blame 履歴
1/// @ref simd
2/// @file glm/simd/matrix.h
3
4#pragma once
5
6#include "geometric.h"
7
8#if GLM_ARCH & GLM_ARCH_SSE2_BIT
9
10GLM_FUNC_QUALIFIER void glm_mat4_matrixCompMult(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])
11{
12 out[0] = _mm_mul_ps(in1[0], in2[0]);
13 out[1] = _mm_mul_ps(in1[1], in2[1]);
14 out[2] = _mm_mul_ps(in1[2], in2[2]);
15 out[3] = _mm_mul_ps(in1[3], in2[3]);
16}
17
18GLM_FUNC_QUALIFIER void glm_mat4_add(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])
19{
20 out[0] = _mm_add_ps(in1[0], in2[0]);
21 out[1] = _mm_add_ps(in1[1], in2[1]);
22 out[2] = _mm_add_ps(in1[2], in2[2]);
23 out[3] = _mm_add_ps(in1[3], in2[3]);
24}
25
26GLM_FUNC_QUALIFIER void glm_mat4_sub(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])
27{
28 out[0] = _mm_sub_ps(in1[0], in2[0]);
29 out[1] = _mm_sub_ps(in1[1], in2[1]);
30 out[2] = _mm_sub_ps(in1[2], in2[2]);
31 out[3] = _mm_sub_ps(in1[3], in2[3]);
32}
33
34GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_mul_vec4(glm_vec4 const m[4], glm_vec4 v)
35{
36 __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
37 __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
38 __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
39 __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));
40
41 __m128 m0 = _mm_mul_ps(m[0], v0);
42 __m128 m1 = _mm_mul_ps(m[1], v1);
43 __m128 m2 = _mm_mul_ps(m[2], v2);
44 __m128 m3 = _mm_mul_ps(m[3], v3);
45
46 __m128 a0 = _mm_add_ps(m0, m1);
47 __m128 a1 = _mm_add_ps(m2, m3);
48 __m128 a2 = _mm_add_ps(a0, a1);
49
50 return a2;
51}
52
53GLM_FUNC_QUALIFIER __m128 glm_vec4_mul_mat4(glm_vec4 v, glm_vec4 const m[4])
54{
55 __m128 i0 = m[0];
56 __m128 i1 = m[1];
57 __m128 i2 = m[2];
58 __m128 i3 = m[3];
59
60 __m128 m0 = _mm_mul_ps(v, i0);
61 __m128 m1 = _mm_mul_ps(v, i1);
62 __m128 m2 = _mm_mul_ps(v, i2);
63 __m128 m3 = _mm_mul_ps(v, i3);
64
65 __m128 u0 = _mm_unpacklo_ps(m0, m1);
66 __m128 u1 = _mm_unpackhi_ps(m0, m1);
67 __m128 a0 = _mm_add_ps(u0, u1);
68
69 __m128 u2 = _mm_unpacklo_ps(m2, m3);
70 __m128 u3 = _mm_unpackhi_ps(m2, m3);
71 __m128 a1 = _mm_add_ps(u2, u3);
72
73 __m128 f0 = _mm_movelh_ps(a0, a1);
74 __m128 f1 = _mm_movehl_ps(a1, a0);
75 __m128 f2 = _mm_add_ps(f0, f1);
76
77 return f2;
78}
79
80GLM_FUNC_QUALIFIER void glm_mat4_mul(glm_vec4 const in1[4], glm_vec4 const in2[4], glm_vec4 out[4])
81{
82 {
83 __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0));
84 __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1));
85 __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2));
86 __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3));
87
88 __m128 m0 = _mm_mul_ps(in1[0], e0);
89 __m128 m1 = _mm_mul_ps(in1[1], e1);
90 __m128 m2 = _mm_mul_ps(in1[2], e2);
91 __m128 m3 = _mm_mul_ps(in1[3], e3);
92
93 __m128 a0 = _mm_add_ps(m0, m1);
94 __m128 a1 = _mm_add_ps(m2, m3);
95 __m128 a2 = _mm_add_ps(a0, a1);
96
97 out[0] = a2;
98 }
99
100 {
101 __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0));
102 __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1));
103 __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2));
104 __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3));
105
106 __m128 m0 = _mm_mul_ps(in1[0], e0);
107 __m128 m1 = _mm_mul_ps(in1[1], e1);
108 __m128 m2 = _mm_mul_ps(in1[2], e2);
109 __m128 m3 = _mm_mul_ps(in1[3], e3);
110
111 __m128 a0 = _mm_add_ps(m0, m1);
112 __m128 a1 = _mm_add_ps(m2, m3);
113 __m128 a2 = _mm_add_ps(a0, a1);
114
115 out[1] = a2;
116 }
117
118 {
119 __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0));
120 __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1));
121 __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2));
122 __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3));
123
124 __m128 m0 = _mm_mul_ps(in1[0], e0);
125 __m128 m1 = _mm_mul_ps(in1[1], e1);
126 __m128 m2 = _mm_mul_ps(in1[2], e2);
127 __m128 m3 = _mm_mul_ps(in1[3], e3);
128
129 __m128 a0 = _mm_add_ps(m0, m1);
130 __m128 a1 = _mm_add_ps(m2, m3);
131 __m128 a2 = _mm_add_ps(a0, a1);
132
133 out[2] = a2;
134 }
135
136 {
137 //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3))
138 __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0));
139 __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1));
140 __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2));
141 __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3));
142
143 __m128 m0 = _mm_mul_ps(in1[0], e0);
144 __m128 m1 = _mm_mul_ps(in1[1], e1);
145 __m128 m2 = _mm_mul_ps(in1[2], e2);
146 __m128 m3 = _mm_mul_ps(in1[3], e3);
147
148 __m128 a0 = _mm_add_ps(m0, m1);
149 __m128 a1 = _mm_add_ps(m2, m3);
150 __m128 a2 = _mm_add_ps(a0, a1);
151
152 out[3] = a2;
153 }
154}
155
156GLM_FUNC_QUALIFIER void glm_mat4_transpose(glm_vec4 const in[4], glm_vec4 out[4])
157{
158 __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);
159 __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);
160 __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44);
161 __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE);
162
163 out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);
164 out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);
165 out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);
166 out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD);
167}
168
169GLM_FUNC_QUALIFIER void glm_mat3_transpose(glm_vec4 const in[3], glm_vec4 out[3])
170{
171 __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);
172 __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);
173 __m128 tmp1 = _mm_shuffle_ps(in[2], in[2], 0x44);
174 __m128 tmp3 = _mm_shuffle_ps(in[2], in[2], 0xEE);
175
176 out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);
177 out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);
178 out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);
179}
180
181GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_highp(glm_vec4 const in[4])
182{
183 __m128 Fac0;
184 {
185 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
186 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
187 // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
188 // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
189
190 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
191 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
192
193 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
194 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
195 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
196 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
197
198 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
199 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
200 Fac0 = _mm_sub_ps(Mul00, Mul01);
201 }
202
203 __m128 Fac1;
204 {
205 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
206 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
207 // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
208 // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
209
210 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
211 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
212
213 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
214 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
215 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
216 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
217
218 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
219 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
220 Fac1 = _mm_sub_ps(Mul00, Mul01);
221 }
222
223
224 __m128 Fac2;
225 {
226 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
227 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
228 // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
229 // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
230
231 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
232 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
233
234 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
235 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
236 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
237 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
238
239 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
240 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
241 Fac2 = _mm_sub_ps(Mul00, Mul01);
242 }
243
244 __m128 Fac3;
245 {
246 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
247 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
248 // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
249 // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
250
251 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
252 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
253
254 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
255 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
256 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
257 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
258
259 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
260 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
261 Fac3 = _mm_sub_ps(Mul00, Mul01);
262 }
263
264 __m128 Fac4;
265 {
266 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
267 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
268 // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
269 // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
270
271 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
272 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
273
274 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
275 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
276 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
277 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
278
279 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
280 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
281 Fac4 = _mm_sub_ps(Mul00, Mul01);
282 }
283
284 __m128 Fac5;
285 {
286 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
287 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
288 // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
289 // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
290
291 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
292 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
293
294 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
295 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
296 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
297 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
298
299 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
300 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
301 Fac5 = _mm_sub_ps(Mul00, Mul01);
302 }
303
304 __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
305 __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
306
307 // m[1][0]
308 // m[0][0]
309 // m[0][0]
310 // m[0][0]
311 __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
312 __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
313
314 // m[1][1]
315 // m[0][1]
316 // m[0][1]
317 // m[0][1]
318 __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
319 __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
320
321 // m[1][2]
322 // m[0][2]
323 // m[0][2]
324 // m[0][2]
325 __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
326 __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
327
328 // m[1][3]
329 // m[0][3]
330 // m[0][3]
331 // m[0][3]
332 __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
333 __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
334
335 // col0
336 // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
337 // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
338 // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
339 // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
340 __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
341 __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
342 __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
343 __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
344 __m128 Add00 = _mm_add_ps(Sub00, Mul02);
345 __m128 Inv0 = _mm_mul_ps(SignB, Add00);
346
347 // col1
348 // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
349 // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
350 // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
351 // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
352 __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
353 __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
354 __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
355 __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
356 __m128 Add01 = _mm_add_ps(Sub01, Mul05);
357 __m128 Inv1 = _mm_mul_ps(SignA, Add01);
358
359 // col2
360 // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
361 // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
362 // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
363 // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
364 __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
365 __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
366 __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
367 __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
368 __m128 Add02 = _mm_add_ps(Sub02, Mul08);
369 __m128 Inv2 = _mm_mul_ps(SignB, Add02);
370
371 // col3
372 // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
373 // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
374 // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
375 // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
376 __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
377 __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
378 __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
379 __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
380 __m128 Add03 = _mm_add_ps(Sub03, Mul11);
381 __m128 Inv3 = _mm_mul_ps(SignA, Add03);
382
383 __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
384 __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));
385 __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));
386
387 // valType Determinant = m[0][0] * Inverse[0][0]
388 // + m[0][1] * Inverse[1][0]
389 // + m[0][2] * Inverse[2][0]
390 // + m[0][3] * Inverse[3][0];
391 __m128 Det0 = glm_vec4_dot(in[0], Row2);
392 return Det0;
393}
394
395GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant_lowp(glm_vec4 const m[4])
396{
397 // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(
398
399 //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
400 //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
401 //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
402 //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
403 //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
404 //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
405
406 // First 2 columns
407 __m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2)));
408 __m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3)));
409 __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);
410
411 // Second 2 columns
412 __m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3)));
413 __m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2)));
414 __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);
415
416 // Columns subtraction
417 __m128 SubE = _mm_sub_ps(MulA, MulB);
418
419 // Last 2 rows
420 __m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2)));
421 __m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0)));
422 __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);
423 __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);
424
425 //vec<4, T, Q> DetCof(
426 // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),
427 // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),
428 // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),
429 // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
430
431 __m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0)));
432 __m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1)));
433 __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);
434
435 __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));
436 __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1];
437 __m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2)));
438 __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);
439
440 __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);
441
442 __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));
443 __m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0)));
444 __m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3)));
445 __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);
446
447 __m128 AddRes = _mm_add_ps(SubRes, MulFacC);
448 __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));
449
450 //return m[0][0] * DetCof[0]
451 // + m[0][1] * DetCof[1]
452 // + m[0][2] * DetCof[2]
453 // + m[0][3] * DetCof[3];
454
455 return glm_vec4_dot(m[0], DetCof);
456}
457
458GLM_FUNC_QUALIFIER glm_vec4 glm_mat4_determinant(glm_vec4 const m[4])
459{
460 // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add)
461
462 //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
463 //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
464 //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
465 //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
466 //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
467 //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
468
469 // First 2 columns
470 __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2));
471 __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3));
472 __m128 MulA = _mm_mul_ps(Swp2A, Swp3A);
473
474 // Second 2 columns
475 __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3));
476 __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2));
477 __m128 MulB = _mm_mul_ps(Swp2B, Swp3B);
478
479 // Columns subtraction
480 __m128 SubE = _mm_sub_ps(MulA, MulB);
481
482 // Last 2 rows
483 __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2));
484 __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0));
485 __m128 MulC = _mm_mul_ps(Swp2C, Swp3C);
486 __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC);
487
488 //vec<4, T, Q> DetCof(
489 // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),
490 // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),
491 // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),
492 // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
493
494 __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0));
495 __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1));
496 __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA);
497
498 __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1));
499 __m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1];
500 __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2));
501 __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB);
502
503 __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB);
504
505 __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2));
506 __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0));
507 __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3));
508 __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC);
509
510 __m128 AddRes = _mm_add_ps(SubRes, MulFacC);
511 __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f));
512
513 //return m[0][0] * DetCof[0]
514 // + m[0][1] * DetCof[1]
515 // + m[0][2] * DetCof[2]
516 // + m[0][3] * DetCof[3];
517
518 return glm_vec4_dot(m[0], DetCof);
519}
520
521GLM_FUNC_QUALIFIER void glm_mat4_inverse(glm_vec4 const in[4], glm_vec4 out[4])
522{
523 __m128 Fac0;
524 {
525 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
526 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
527 // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
528 // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
529
530 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
531 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
532
533 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
534 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
535 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
536 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
537
538 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
539 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
540 Fac0 = _mm_sub_ps(Mul00, Mul01);
541 }
542
543 __m128 Fac1;
544 {
545 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
546 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
547 // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
548 // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
549
550 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
551 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
552
553 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
554 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
555 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
556 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
557
558 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
559 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
560 Fac1 = _mm_sub_ps(Mul00, Mul01);
561 }
562
563
564 __m128 Fac2;
565 {
566 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
567 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
568 // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
569 // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
570
571 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
572 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
573
574 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
575 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
576 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
577 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
578
579 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
580 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
581 Fac2 = _mm_sub_ps(Mul00, Mul01);
582 }
583
584 __m128 Fac3;
585 {
586 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
587 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
588 // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
589 // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
590
591 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
592 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
593
594 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
595 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
596 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
597 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
598
599 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
600 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
601 Fac3 = _mm_sub_ps(Mul00, Mul01);
602 }
603
604 __m128 Fac4;
605 {
606 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
607 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
608 // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
609 // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
610
611 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
612 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
613
614 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
615 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
616 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
617 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
618
619 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
620 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
621 Fac4 = _mm_sub_ps(Mul00, Mul01);
622 }
623
624 __m128 Fac5;
625 {
626 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
627 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
628 // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
629 // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
630
631 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
632 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
633
634 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
635 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
636 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
637 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
638
639 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
640 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
641 Fac5 = _mm_sub_ps(Mul00, Mul01);
642 }
643
644 __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
645 __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
646
647 // m[1][0]
648 // m[0][0]
649 // m[0][0]
650 // m[0][0]
651 __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
652 __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
653
654 // m[1][1]
655 // m[0][1]
656 // m[0][1]
657 // m[0][1]
658 __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
659 __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
660
661 // m[1][2]
662 // m[0][2]
663 // m[0][2]
664 // m[0][2]
665 __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
666 __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
667
668 // m[1][3]
669 // m[0][3]
670 // m[0][3]
671 // m[0][3]
672 __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
673 __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
674
675 // col0
676 // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
677 // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
678 // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
679 // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
680 __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
681 __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
682 __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
683 __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
684 __m128 Add00 = _mm_add_ps(Sub00, Mul02);
685 __m128 Inv0 = _mm_mul_ps(SignB, Add00);
686
687 // col1
688 // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
689 // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
690 // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
691 // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
692 __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
693 __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
694 __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
695 __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
696 __m128 Add01 = _mm_add_ps(Sub01, Mul05);
697 __m128 Inv1 = _mm_mul_ps(SignA, Add01);
698
699 // col2
700 // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
701 // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
702 // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
703 // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
704 __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
705 __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
706 __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
707 __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
708 __m128 Add02 = _mm_add_ps(Sub02, Mul08);
709 __m128 Inv2 = _mm_mul_ps(SignB, Add02);
710
711 // col3
712 // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
713 // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
714 // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
715 // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
716 __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
717 __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
718 __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
719 __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
720 __m128 Add03 = _mm_add_ps(Sub03, Mul11);
721 __m128 Inv3 = _mm_mul_ps(SignA, Add03);
722
723 __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
724 __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));
725 __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));
726
727 // valType Determinant = m[0][0] * Inverse[0][0]
728 // + m[0][1] * Inverse[1][0]
729 // + m[0][2] * Inverse[2][0]
730 // + m[0][3] * Inverse[3][0];
731 __m128 Det0 = glm_vec4_dot(in[0], Row2);
732 __m128 Rcp0 = _mm_div_ps(_mm_set1_ps(1.0f), Det0);
733 //__m128 Rcp0 = _mm_rcp_ps(Det0);
734
735 // Inverse /= Determinant;
736 out[0] = _mm_mul_ps(Inv0, Rcp0);
737 out[1] = _mm_mul_ps(Inv1, Rcp0);
738 out[2] = _mm_mul_ps(Inv2, Rcp0);
739 out[3] = _mm_mul_ps(Inv3, Rcp0);
740}
741
742GLM_FUNC_QUALIFIER void glm_mat4_inverse_lowp(glm_vec4 const in[4], glm_vec4 out[4])
743{
744 __m128 Fac0;
745 {
746 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
747 // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
748 // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
749 // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
750
751 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
752 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
753
754 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
755 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
756 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
757 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
758
759 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
760 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
761 Fac0 = _mm_sub_ps(Mul00, Mul01);
762 }
763
764 __m128 Fac1;
765 {
766 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
767 // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
768 // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
769 // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
770
771 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
772 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
773
774 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
775 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
776 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
777 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
778
779 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
780 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
781 Fac1 = _mm_sub_ps(Mul00, Mul01);
782 }
783
784
785 __m128 Fac2;
786 {
787 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
788 // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
789 // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
790 // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
791
792 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
793 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
794
795 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
796 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
797 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
798 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
799
800 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
801 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
802 Fac2 = _mm_sub_ps(Mul00, Mul01);
803 }
804
805 __m128 Fac3;
806 {
807 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
808 // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
809 // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
810 // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
811
812 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
813 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
814
815 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
816 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
817 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
818 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
819
820 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
821 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
822 Fac3 = _mm_sub_ps(Mul00, Mul01);
823 }
824
825 __m128 Fac4;
826 {
827 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
828 // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
829 // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
830 // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
831
832 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
833 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
834
835 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
836 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
837 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
838 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
839
840 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
841 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
842 Fac4 = _mm_sub_ps(Mul00, Mul01);
843 }
844
845 __m128 Fac5;
846 {
847 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
848 // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
849 // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
850 // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
851
852 __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
853 __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
854
855 __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
856 __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
857 __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
858 __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
859
860 __m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
861 __m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
862 Fac5 = _mm_sub_ps(Mul00, Mul01);
863 }
864
865 __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
866 __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
867
868 // m[1][0]
869 // m[0][0]
870 // m[0][0]
871 // m[0][0]
872 __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
873 __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
874
875 // m[1][1]
876 // m[0][1]
877 // m[0][1]
878 // m[0][1]
879 __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
880 __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
881
882 // m[1][2]
883 // m[0][2]
884 // m[0][2]
885 // m[0][2]
886 __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
887 __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
888
889 // m[1][3]
890 // m[0][3]
891 // m[0][3]
892 // m[0][3]
893 __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
894 __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
895
896 // col0
897 // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
898 // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
899 // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
900 // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
901 __m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
902 __m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
903 __m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
904 __m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
905 __m128 Add00 = _mm_add_ps(Sub00, Mul02);
906 __m128 Inv0 = _mm_mul_ps(SignB, Add00);
907
908 // col1
909 // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
910 // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
911 // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
912 // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
913 __m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
914 __m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
915 __m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
916 __m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
917 __m128 Add01 = _mm_add_ps(Sub01, Mul05);
918 __m128 Inv1 = _mm_mul_ps(SignA, Add01);
919
920 // col2
921 // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
922 // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
923 // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
924 // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
925 __m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
926 __m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
927 __m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
928 __m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
929 __m128 Add02 = _mm_add_ps(Sub02, Mul08);
930 __m128 Inv2 = _mm_mul_ps(SignB, Add02);
931
932 // col3
933 // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
934 // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
935 // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
936 // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
937 __m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
938 __m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
939 __m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
940 __m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
941 __m128 Add03 = _mm_add_ps(Sub03, Mul11);
942 __m128 Inv3 = _mm_mul_ps(SignA, Add03);
943
944 __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
945 __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));
946 __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));
947
948 // valType Determinant = m[0][0] * Inverse[0][0]
949 // + m[0][1] * Inverse[1][0]
950 // + m[0][2] * Inverse[2][0]
951 // + m[0][3] * Inverse[3][0];
952 __m128 Det0 = glm_vec4_dot(in[0], Row2);
953 __m128 Rcp0 = _mm_rcp_ps(Det0);
954 //__m128 Rcp0 = _mm_div_ps(one, Det0);
955 // Inverse /= Determinant;
956 out[0] = _mm_mul_ps(Inv0, Rcp0);
957 out[1] = _mm_mul_ps(Inv1, Rcp0);
958 out[2] = _mm_mul_ps(Inv2, Rcp0);
959 out[3] = _mm_mul_ps(Inv3, Rcp0);
960}
961/*
962GLM_FUNC_QUALIFIER void glm_mat4_rotate(__m128 const in[4], float Angle, float const v[3], __m128 out[4])
963{
964 float a = glm::radians(Angle);
965 float c = cos(a);
966 float s = sin(a);
967
968 glm::vec4 AxisA(v[0], v[1], v[2], float(0));
969 __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);
970 __m128 AxisC = detail::sse_nrm_ps(AxisB);
971
972 __m128 Cos0 = _mm_set_ss(c);
973 __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));
974 __m128 Sin0 = _mm_set_ss(s);
975 __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0));
976
977 // vec<3, T, Q> temp = (valType(1) - c) * axis;
978 __m128 Temp0 = _mm_sub_ps(one, CosA);
979 __m128 Temp1 = _mm_mul_ps(Temp0, AxisC);
980
981 //Rotate[0][0] = c + temp[0] * axis[0];
982 //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
983 //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];
984 __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0));
985 __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC);
986 __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0));
987 __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0);
988 __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f);
989 __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3));
990 __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2);
991 __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3);
992
993 //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
994 //Rotate[1][1] = c + temp[1] * axis[1];
995 //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
996 __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1));
997 __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC);
998 __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1));
999 __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0);
1000 __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f);
1001 __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2));
1002 __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2);
1003 __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3);
1004
1005 //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
1006 //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
1007 //Rotate[2][2] = c + temp[2] * axis[2];
1008 __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2));
1009 __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC);
1010 __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1));
1011 __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0);
1012 __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f);
1013 __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1));
1014 __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2);
1015 __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3);
1016
1017 __m128 Result[4];
1018 Result[0] = TmpA4;
1019 Result[1] = TmpB4;
1020 Result[2] = TmpC4;
1021 Result[3] = _mm_set_ps(1, 0, 0, 0);
1022
1023 //mat<4, 4, valType> Result;
1024 //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
1025 //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
1026 //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
1027 //Result[3] = m[3];
1028 //return Result;
1029 sse_mul_ps(in, Result, out);
1030}
1031*/
1032GLM_FUNC_QUALIFIER void glm_mat4_outerProduct(__m128 const& c, __m128 const& r, __m128 out[4])
1033{
1034 out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0)));
1035 out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1)));
1036 out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2)));
1037 out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3)));
1038}
1039
1040#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT