diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 1824357..f52fd6a 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -633,10 +633,14 @@ glm_vec4_distance(vec4 v1, vec4 v2) { CGLM_INLINE void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + _mm_store_ps(dest, _mm_max_ps(_mm_load_ps(v1), _mm_load_ps(v2))); +#else dest[0] = glm_max(v1[0], v2[0]); dest[1] = glm_max(v1[1], v2[1]); dest[2] = glm_max(v1[2], v2[2]); dest[3] = glm_max(v1[3], v2[3]); +#endif } /*! @@ -649,10 +653,14 @@ glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) { CGLM_INLINE void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest) { +#if defined( __SSE__ ) || defined( __SSE2__ ) + _mm_store_ps(dest, _mm_min_ps(_mm_load_ps(v1), _mm_load_ps(v2))); +#else dest[0] = glm_min(v1[0], v2[0]); dest[1] = glm_min(v1[1], v2[1]); dest[2] = glm_min(v1[2], v2[2]); dest[3] = glm_min(v1[3], v2[3]); +#endif } /*! diff --git a/test/src/test_vec4.c b/test/src/test_vec4.c index 93ce9f7..b9fb2ab 100644 --- a/test/src/test_vec4.c +++ b/test/src/test_vec4.c @@ -38,9 +38,25 @@ test_vec4_norm(vec4 vec) { return sqrtf(test_vec4_dot(vec, vec)); } +void +test_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) { + dest[0] = glm_max(v1[0], v2[0]); + dest[1] = glm_max(v1[1], v2[1]); + dest[2] = glm_max(v1[2], v2[2]); + dest[3] = glm_max(v1[3], v2[3]); +} + +void +test_vec4_minv(vec4 v1, vec4 v2, vec4 dest) { + dest[0] = glm_min(v1[0], v2[0]); + dest[1] = glm_min(v1[1], v2[1]); + dest[2] = glm_min(v1[2], v2[2]); + dest[3] = glm_min(v1[3], v2[3]); +} + void test_vec4(void **state) { - vec4 v, v1, v2; + vec4 v, v1, v2, v3, v4; int i; float d1, d2; @@ -123,4 +139,16 @@ test_vec4(void **state) { glm_vec4_broadcast(3, v2); glm_vec4_muladd(v1, v2, v); assert_true(glmc_vec4_eq_eps(v, 10)); + + /* min, max */ + test_rand_vec4(v1); + test_rand_vec4(v2); + + glm_vec4_maxv(v1, v2, v3); + test_vec4_maxv(v1, v2, v4); + test_assert_vec4_eq(v3, v4); + + glm_vec4_minv(v1, v2, v3); + test_vec4_minv(v1, v2, v4); + test_assert_vec4_eq(v3, v4); }