mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 17:09:40 +00:00
sse2 version of vec4 dot product
* use this for normalizing vector
This commit is contained in:
@@ -122,7 +122,14 @@ glm_vec4_copy(vec4 v, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_dot(vec4 a, vec4 b) {
|
glm_vec4_dot(vec4 a, vec4 b) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
__m128 x0;
|
||||||
|
x0 = _mm_mul_ps(_mm_load_ps(a), _mm_load_ps(b));
|
||||||
|
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 0, 3, 2));
|
||||||
|
return _mm_cvtss_f32(_mm_add_ss(x0, _mm_shuffle1_ps(x0, 0, 1, 0, 1)));
|
||||||
|
#else
|
||||||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -139,7 +146,7 @@ glm_vec4_dot(vec4 a, vec4 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_norm2(vec4 v) {
|
glm_vec4_norm2(vec4 v) {
|
||||||
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
|
return glm_vec_dot(v, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@@ -109,6 +109,8 @@ test_tests_SOURCES=\
|
|||||||
test/src/test_project.c \
|
test/src/test_project.c \
|
||||||
test/src/test_clamp.c \
|
test/src/test_clamp.c \
|
||||||
test/src/test_euler.c \
|
test/src/test_euler.c \
|
||||||
test/src/test_quat.c
|
test/src/test_quat.c \
|
||||||
|
test/src/test_vec4.c
|
||||||
|
|
||||||
all-local:
|
all-local:
|
||||||
sh ./post-build.sh
|
sh ./post-build.sh
|
||||||
|
@@ -36,6 +36,16 @@ test_rand_vec3(vec3 dest) {
|
|||||||
dest[2] = drand48();
|
dest[2] = drand48();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_rand_vec4(vec4 dest) {
|
||||||
|
srand((unsigned int)time(NULL));
|
||||||
|
|
||||||
|
dest[0] = drand48();
|
||||||
|
dest[1] = drand48();
|
||||||
|
dest[2] = drand48();
|
||||||
|
dest[3] = drand48();
|
||||||
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
test_rand_angle(void) {
|
test_rand_angle(void) {
|
||||||
srand((unsigned int)time(NULL));
|
srand((unsigned int)time(NULL));
|
||||||
|
@@ -40,6 +40,9 @@ test_assert_quat_eq(versor v1, versor v2);
|
|||||||
void
|
void
|
||||||
test_rand_vec3(vec3 dest);
|
test_rand_vec3(vec3 dest);
|
||||||
|
|
||||||
|
void
|
||||||
|
test_rand_vec4(vec4 dest) ;
|
||||||
|
|
||||||
float
|
float
|
||||||
test_rand_angle(void);
|
test_rand_angle(void);
|
||||||
|
|
||||||
|
@@ -26,7 +26,10 @@ main(int argc, const char * argv[]) {
|
|||||||
cmocka_unit_test(test_euler),
|
cmocka_unit_test(test_euler),
|
||||||
|
|
||||||
/* quaternion */
|
/* quaternion */
|
||||||
cmocka_unit_test(test_quat)
|
cmocka_unit_test(test_quat),
|
||||||
|
|
||||||
|
/* vec4 */
|
||||||
|
cmocka_unit_test(test_vec4)
|
||||||
};
|
};
|
||||||
|
|
||||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
@@ -28,4 +28,7 @@ test_euler(void **state);
|
|||||||
void
|
void
|
||||||
test_quat(void **state);
|
test_quat(void **state);
|
||||||
|
|
||||||
|
void
|
||||||
|
test_vec4(void **state);
|
||||||
|
|
||||||
#endif /* test_tests_h */
|
#endif /* test_tests_h */
|
||||||
|
30
test/src/test_vec4.c
Normal file
30
test/src/test_vec4.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
test_vec4_dot(vec4 a, vec4 b) {
|
||||||
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_vec4(void **state) {
|
||||||
|
vec4 v;
|
||||||
|
int i;
|
||||||
|
float d1, d2;
|
||||||
|
|
||||||
|
/* test SSE/SIMD dot product */
|
||||||
|
for (i = 0; i < 100; i++) {
|
||||||
|
test_rand_vec4(v);
|
||||||
|
d1 = glm_vec4_dot(v, v);
|
||||||
|
d2 = test_vec4_dot(v, v);
|
||||||
|
|
||||||
|
assert_true(fabsf(d1 - d2) <= 0.000009);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user