From 8f2f2c55728ef8cf657eb62ac976d64275e3d7ca Mon Sep 17 00:00:00 2001 From: Wasin Thonkaew Date: Fri, 19 Apr 2019 01:47:50 +0800 Subject: [PATCH 1/3] Fix to use armv7 compatible function for glm_vec4_distance Before it used armv8 only function thus it leads to build failed for Android with target of armv7 i.e. armeabi-v7a. This fixed that issue. --- include/cglm/vec4.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index b94cf61..2b62c1b 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -697,11 +697,7 @@ glm_vec4_distance(vec4 a, vec4 b) { return _mm_cvtss_f32(_mm_sqrt_ss(_mm_add_ss(x0, glmm_shuff1(x0, 0, 1, 0, 1)))); #elif defined(CGLM_NEON_FP) - float32x4_t v0; - float32_t r; - v0 = vsubq_f32(vld1q_f32(a), vld1q_f32(b)); - r = vaddvq_f32(vmulq_f32(v0, v0)); - return sqrtf(r); + return glmm_norm(vsubq_f32(glmm_load(a), glmm_load(b))); #else return sqrtf(glm_pow2(b[0] - a[0]) + glm_pow2(b[1] - a[1]) From 461a4009badb0afff795c5e693c0887d5c69b5c5 Mon Sep 17 00:00:00 2001 From: Wasin Thonkaew Date: Fri, 19 Apr 2019 02:07:57 +0800 Subject: [PATCH 2/3] refactor vec4 : glm_vec4_distance for SSE/SSE2 According to suggestion by recp at https://github.com/recp/cglm/issues/82#issuecomment-483051704. --- include/cglm/vec4.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/include/cglm/vec4.h b/include/cglm/vec4.h index 2b62c1b..d053ed5 100644 --- a/include/cglm/vec4.h +++ b/include/cglm/vec4.h @@ -690,12 +690,7 @@ CGLM_INLINE float glm_vec4_distance(vec4 a, vec4 b) { #if defined( __SSE__ ) || defined( __SSE2__ ) - __m128 x0; - x0 = _mm_sub_ps(glmm_load(b), glmm_load(a)); - x0 = _mm_mul_ps(x0, x0); - x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2)); - return _mm_cvtss_f32(_mm_sqrt_ss(_mm_add_ss(x0, - glmm_shuff1(x0, 0, 1, 0, 1)))); + return glmm_norm(_mm_sub_ps(glmm_load(b), glmm_load(a))); #elif defined(CGLM_NEON_FP) return glmm_norm(vsubq_f32(glmm_load(a), glmm_load(b))); #else From 5b80e0e3c22af24c19c44c403b4476d2909c12e0 Mon Sep 17 00:00:00 2001 From: Wasin Thonkaew Date: Fri, 19 Apr 2019 03:04:00 +0800 Subject: [PATCH 3/3] test cases for glm_vec4_distance --- test/src/test_common.c | 1 + test/src/test_vec4.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/test/src/test_common.c b/test/src/test_common.c index d41d3cb..0afc235 100644 --- a/test/src/test_common.c +++ b/test/src/test_common.c @@ -5,6 +5,7 @@ #include "test_common.h" #include +#include #define m 4 #define n 4 diff --git a/test/src/test_vec4.c b/test/src/test_vec4.c index 8e4fda5..daf4e00 100644 --- a/test/src/test_vec4.c +++ b/test/src/test_vec4.c @@ -93,6 +93,13 @@ test_vec4(void **state) { /* 3. test SIMD norm2 */ test_rand_vec4(v); test_assert_eqf(test_vec4_norm2(v), glm_vec4_norm2(v)); + + /* 4. test SSE/SIMD distance */ + test_rand_vec4(v1); + test_rand_vec4(v2); + d1 = glm_vec4_distance(v1, v2); + d2 = sqrtf(powf(v1[0]-v2[0], 2.0f) + pow(v1[1]-v2[1], 2.0f) + pow(v1[2]-v2[2], 2.0f) + pow(v1[3]-v2[3], 2.0f)); + assert_true(fabsf(d1 - d2) <= 0.000009); } /* test zero */