mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Vector subtraction functions
Add subtraction family of functions for vectors.
This commit is contained in:
@@ -39,6 +39,12 @@
|
||||
CGLM_INLINE void glm_vec4_muladds(vec4 a, float s, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_subsub(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_addsub(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_mulsubs(vec4 a, float s, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_maxsub(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_minsub(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_INLINE void glm_vec4_negate(vec4 v);
|
||||
CGLM_INLINE void glm_vec4_inv(vec4 v);
|
||||
CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest);
|
||||
@@ -698,6 +704,178 @@ glm_vec4_minadd(vec4 a, vec4 b, vec4 dest) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief sub two vectors and sub result to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector 1
|
||||
* @param[in] b vector 2
|
||||
* @param[out] dest dest -= (a - b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_subsub(vec4 a, vec4 b, vec4 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glmm_store(dest, wasm_f32x4_sub(
|
||||
glmm_load(dest),
|
||||
wasm_f32x4_sub(glmm_load(a), glmm_load(b))));
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glmm_store(dest, _mm_sub_ps(glmm_load(dest),
|
||||
_mm_sub_ps(glmm_load(a),
|
||||
glmm_load(b))));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(dest, vsubq_f32(vld1q_f32(dest),
|
||||
vsubq_f32(vld1q_f32(a),
|
||||
vld1q_f32(b))));
|
||||
#else
|
||||
dest[0] -= a[0] - b[0];
|
||||
dest[1] -= a[1] - b[1];
|
||||
dest[2] -= a[2] - b[2];
|
||||
dest[3] -= a[3] - b[3];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief add two vectors and sub result to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector 1
|
||||
* @param[in] b vector 2
|
||||
* @param[out] dest dest -= (a + b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_addsub(vec4 a, vec4 b, vec4 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glmm_store(dest, wasm_f32x4_add(
|
||||
glmm_load(dest),
|
||||
wasm_f32x4_sub(glmm_load(a), glmm_load(b))));
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||
_mm_sub_ps(glmm_load(a),
|
||||
glmm_load(b))));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||
vsubq_f32(vld1q_f32(a),
|
||||
vld1q_f32(b))));
|
||||
#else
|
||||
dest[0] += a[0] - b[0];
|
||||
dest[1] += a[1] - b[1];
|
||||
dest[2] += a[2] - b[2];
|
||||
dest[3] += a[3] - b[3];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief mul two vectors and sub result to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector 1
|
||||
* @param[in] b vector 2
|
||||
* @param[out] dest dest -= (a * b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_mulsub(vec4 a, vec4 b, vec4 dest) {
|
||||
#if defined(CGLM_SIMD)
|
||||
glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_load(b), glmm_load(dest)));
|
||||
#else
|
||||
dest[0] -= a[0] * b[0];
|
||||
dest[1] -= a[1] * b[1];
|
||||
dest[2] -= a[2] * b[2];
|
||||
dest[3] -= a[3] * b[3];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief mul vector with scalar and sub result to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector
|
||||
* @param[in] s scalar
|
||||
* @param[out] dest dest -= (a * b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_mulsubs(vec4 a, float s, vec4 dest) {
|
||||
#if defined(CGLM_SIMD)
|
||||
glmm_store(dest, glmm_fmsub(glmm_load(a), glmm_set1(s), glmm_load(dest)));
|
||||
#else
|
||||
dest[0] -= a[0] * s;
|
||||
dest[1] -= a[1] * s;
|
||||
dest[2] -= a[2] * s;
|
||||
dest[3] -= a[3] * s;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief sub max of two vectors to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector 1
|
||||
* @param[in] b vector 2
|
||||
* @param[out] dest dest -= max(a, b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_maxsub(vec4 a, vec4 b, vec4 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glmm_store(dest, wasm_f32x4_sub(
|
||||
glmm_load(dest),
|
||||
wasm_f32x4_pmax(glmm_load(a), glmm_load(b))));
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glmm_store(dest, _mm_sub_ps(glmm_load(dest),
|
||||
_mm_max_ps(glmm_load(a),
|
||||
glmm_load(b))));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(dest, vsubq_f32(vld1q_f32(dest),
|
||||
vmaxq_f32(vld1q_f32(a),
|
||||
vld1q_f32(b))));
|
||||
#else
|
||||
dest[0] -= glm_max(a[0], b[0]);
|
||||
dest[1] -= glm_max(a[1], b[1]);
|
||||
dest[2] -= glm_max(a[2], b[2]);
|
||||
dest[3] -= glm_max(a[3], b[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief sub min of two vectors to dest
|
||||
*
|
||||
* it applies -= operator so dest must be initialized
|
||||
*
|
||||
* @param[in] a vector 1
|
||||
* @param[in] b vector 2
|
||||
* @param[out] dest dest -= min(a, b)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_minsub(vec4 a, vec4 b, vec4 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glmm_store(dest, wasm_f32x4_sub(
|
||||
glmm_load(dest),
|
||||
wasm_f32x4_pmin(glmm_load(a), glmm_load(b))));
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glmm_store(dest, _mm_sub_ps(glmm_load(dest),
|
||||
_mm_min_ps(glmm_load(a),
|
||||
glmm_load(b))));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(dest, vsubq_f32(vld1q_f32(dest),
|
||||
vminq_f32(vld1q_f32(a),
|
||||
vld1q_f32(b))));
|
||||
#else
|
||||
dest[0] -= glm_min(a[0], b[0]);
|
||||
dest[1] -= glm_min(a[1], b[1]);
|
||||
dest[2] -= glm_min(a[2], b[2]);
|
||||
dest[3] -= glm_min(a[3], b[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief negate vector components and store result in dest
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user