|
|
|
@ -7,14 +7,14 @@ namespace glm{ |
|
|
|
|
namespace detail |
|
|
|
|
{ |
|
|
|
|
# if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED |
|
|
|
|
template<qualifier P, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, float, P, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4> |
|
|
|
|
template<qualifier Q, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, float, Q, E0,E1,E2,E3, true> : public _swizzle_base0<float, 4> |
|
|
|
|
{ |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, float, P> operator ()() const |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, float, Q> operator ()() const |
|
|
|
|
{ |
|
|
|
|
__m128 data = *reinterpret_cast<__m128 const*>(&this->_buffer); |
|
|
|
|
|
|
|
|
|
vec<4, float, P> Result; |
|
|
|
|
vec<4, float, Q> Result; |
|
|
|
|
# if GLM_ARCH & GLM_ARCH_AVX_BIT |
|
|
|
|
Result.data = _mm_permute_ps(data, _MM_SHUFFLE(E3, E2, E1, E0)); |
|
|
|
|
# else |
|
|
|
@ -24,27 +24,27 @@ namespace detail |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<qualifier P, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, int32, P, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4> |
|
|
|
|
template<qualifier Q, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, int32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<int32, 4> |
|
|
|
|
{ |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, int32, P> operator ()() const |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, int32, Q> operator ()() const |
|
|
|
|
{ |
|
|
|
|
__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); |
|
|
|
|
|
|
|
|
|
vec<4, int32, P> Result; |
|
|
|
|
vec<4, int32, Q> Result; |
|
|
|
|
Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<qualifier P, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, uint32, P, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4> |
|
|
|
|
template<qualifier Q, int E0, int E1, int E2, int E3> |
|
|
|
|
struct _swizzle_base1<4, uint32, Q, E0,E1,E2,E3, true> : public _swizzle_base0<uint32, 4> |
|
|
|
|
{ |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, uint32, P> operator ()() const |
|
|
|
|
GLM_FUNC_QUALIFIER vec<4, uint32, Q> operator ()() const |
|
|
|
|
{ |
|
|
|
|
__m128i data = *reinterpret_cast<__m128i const*>(&this->_buffer); |
|
|
|
|
|
|
|
|
|
vec<4, uint32, P> Result; |
|
|
|
|
vec<4, uint32, Q> Result; |
|
|
|
|
Result.data = _mm_shuffle_epi32(data, _MM_SHUFFLE(E3, E2, E1, E0)); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -52,11 +52,11 @@ namespace detail |
|
|
|
|
# endif// GLM_SWIZZLE == GLM_SWIZZLE_ENABLED |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_add<float, P, true> |
|
|
|
|
struct compute_vec4_add<float, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, float, P> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, float, P> Result; |
|
|
|
|
vec<4, float, Q> Result; |
|
|
|
|
Result.data = _mm_add_ps(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -64,11 +64,11 @@ namespace detail |
|
|
|
|
|
|
|
|
|
# if GLM_ARCH & GLM_ARCH_AVX_BIT |
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_add<double, P, true> |
|
|
|
|
struct compute_vec4_add<double, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, double, P> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, double, P> Result; |
|
|
|
|
vec<4, double, Q> Result; |
|
|
|
|
Result.data = _mm256_add_pd(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -76,11 +76,11 @@ namespace detail |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_sub<float, P, true> |
|
|
|
|
struct compute_vec4_sub<float, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, float, P> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, float, P> Result; |
|
|
|
|
vec<4, float, Q> Result; |
|
|
|
|
Result.data = _mm_sub_ps(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -88,11 +88,11 @@ namespace detail |
|
|
|
|
|
|
|
|
|
# if GLM_ARCH & GLM_ARCH_AVX_BIT |
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_sub<double, P, true> |
|
|
|
|
struct compute_vec4_sub<double, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, double, P> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, double, P> Result; |
|
|
|
|
vec<4, double, Q> Result; |
|
|
|
|
Result.data = _mm256_sub_pd(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -100,11 +100,11 @@ namespace detail |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_mul<float, P, true> |
|
|
|
|
struct compute_vec4_mul<float, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, float, P> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, float, P> Result; |
|
|
|
|
vec<4, float, Q> Result; |
|
|
|
|
Result.data = _mm_mul_ps(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -112,11 +112,11 @@ namespace detail |
|
|
|
|
|
|
|
|
|
# if GLM_ARCH & GLM_ARCH_AVX_BIT |
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_mul<double, P, true> |
|
|
|
|
struct compute_vec4_mul<double, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, double, P> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, double, P> Result; |
|
|
|
|
vec<4, double, Q> Result; |
|
|
|
|
Result.data = _mm256_mul_pd(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -124,11 +124,11 @@ namespace detail |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_div<float, P, true> |
|
|
|
|
struct compute_vec4_div<float, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, float, P> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
static vec<4, float, Q> call(vec<4, float, Q> const& a, vec<4, float, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, float, P> Result; |
|
|
|
|
vec<4, float, Q> Result; |
|
|
|
|
Result.data = _mm_div_ps(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -136,11 +136,11 @@ namespace detail |
|
|
|
|
|
|
|
|
|
# if GLM_ARCH & GLM_ARCH_AVX_BIT |
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_div<double, P, true> |
|
|
|
|
struct compute_vec4_div<double, Q, true> |
|
|
|
|
{ |
|
|
|
|
static vec<4, double, P> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
static vec<4, double, Q> call(vec<4, double, Q> const& a, vec<4, double, Q> const& b) |
|
|
|
|
{ |
|
|
|
|
vec<4, double, P> Result; |
|
|
|
|
vec<4, double, Q> Result; |
|
|
|
|
Result.data = _mm256_div_pd(a.data, b.data); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
@ -303,7 +303,7 @@ namespace detail |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_equal<float, P, false, 32, true> |
|
|
|
|
struct compute_vec4_equal<float, Q, false, 32, true> |
|
|
|
|
{ |
|
|
|
|
static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) |
|
|
|
|
{ |
|
|
|
@ -312,7 +312,7 @@ namespace detail |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_equal<int32, P, true, 32, true> |
|
|
|
|
struct compute_vec4_equal<int32, Q, true, 32, true> |
|
|
|
|
{ |
|
|
|
|
static bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) |
|
|
|
|
{ |
|
|
|
@ -321,7 +321,7 @@ namespace detail |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_nequal<float, P, false, 32, true> |
|
|
|
|
struct compute_vec4_nequal<float, Q, false, 32, true> |
|
|
|
|
{ |
|
|
|
|
static bool call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2) |
|
|
|
|
{ |
|
|
|
@ -330,7 +330,7 @@ namespace detail |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template<qualifier Q> |
|
|
|
|
struct compute_vec4_nequal<int32, P, true, 32, true> |
|
|
|
|
struct compute_vec4_nequal<int32, Q, true, 32, true> |
|
|
|
|
{ |
|
|
|
|
static bool call(vec<4, int32, Q> const& v1, vec<4, int32, Q> const& v2) |
|
|
|
|
{ |
|
|
|
|