diff --git a/include/cglm/simd/intrin.h b/include/cglm/simd/intrin.h index c9ab352..9fef5a1 100644 --- a/include/cglm/simd/intrin.h +++ b/include/cglm/simd/intrin.h @@ -52,7 +52,7 @@ glmm_norm(__m128 a) { static inline __m128 -glmm_load3(vec3 v) { +glmm_load3(float v[3]) { __m128i xy; __m128 z; @@ -64,7 +64,7 @@ glmm_load3(vec3 v) { static inline void -glmm_store3(__m128 vx, vec3 v) { +glmm_store3(__m128 vx, float v[3]) { _mm_storel_pi((__m64 *)&v[0], vx); _mm_store_ss(&v[2], _mm_shuffle1_ps(vx, 2, 2, 2, 2)); } diff --git a/include/cglm/types.h b/include/cglm/types.h index 5d39a55..ad4eb02 100644 --- a/include/cglm/types.h +++ b/include/cglm/types.h @@ -9,20 +9,32 @@ #define cglm_types_h #if defined(_MSC_VER) -# define CGLM_ALIGN(X) /* __declspec(align(X)) */ +#if _MSC_VER < 1914 /* Visual Studio 2017 version 15.7 */ +# define CGLM_ALL_UNALIGNED +/* do not use alignment for older visual studio versions */ +# define CGLM_ALIGN(X) /* __declspec(align(X)) */ +#else +# define CGLM_ALIGN(X) __declspec(align(X)) +#endif #else # define CGLM_ALIGN(X) __attribute((aligned(X))) #endif -typedef float vec2[2]; -typedef CGLM_ALIGN(8) float vec3[3]; -typedef int ivec3[3]; -typedef CGLM_ALIGN(16) float vec4[4]; +#ifndef CGLM_ALL_UNALIGNED +# define CGLM_ALIGN_IF(X) CGLM_ALIGN(X) +#else +# define CGLM_ALIGN_IF(X) /* no alignment */ +#endif + +typedef float vec2[2]; +typedef CGLM_ALIGN_IF(8) float vec3[3]; +typedef int ivec3[3]; +typedef CGLM_ALIGN_IF(16) float vec4[4]; typedef vec3 mat3[3]; -typedef CGLM_ALIGN(16) vec4 mat4[4]; +typedef CGLM_ALIGN_IF(16) vec4 mat4[4]; -typedef vec4 versor; +typedef vec4 versor; #define CGLM_PI (float)M_PI #define CGLM_PI_2 (float)M_PI_2