|
|
@ -62,60 +62,114 @@ namespace detail |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
template <precision P> |
|
|
|
struct compute_vec4_and<int, P> |
|
|
|
struct compute_vec4_and<int32, P> |
|
|
|
{ |
|
|
|
{ |
|
|
|
static tvec4<int, P> call(tvec4<int, P> const& a, tvec4<int, P> const& b) |
|
|
|
static tvec4<int32, P> call(tvec4<int32, P> const& a, tvec4<int32, P> const& b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
tvec4<int, P> Result(uninitialize); |
|
|
|
tvec4<int32, P> Result(uninitialize); |
|
|
|
Result.data = _mm_and_si128(a.data, b.data); |
|
|
|
Result.data = _mm_and_si128(a.data, b.data); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
template <precision P> |
|
|
|
struct compute_vec4_or<int, P> |
|
|
|
struct compute_vec4_and<uint32, P> |
|
|
|
{ |
|
|
|
{ |
|
|
|
static tvec4<int, P> call(tvec4<int, P> const& a, tvec4<int, P> const& b) |
|
|
|
static tvec4<uint32, P> call(tvec4<uint32, P> const& a, tvec4<uint32, P> const& b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
tvec4<int, P> Result(uninitialize); |
|
|
|
tvec4<uint32, P> Result(uninitialize); |
|
|
|
|
|
|
|
Result.data = _mm_and_si128(a.data, b.data); |
|
|
|
|
|
|
|
return Result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
|
|
|
|
struct compute_vec4_or<int32, P> |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static tvec4<int32, P> call(tvec4<int32, P> const& a, tvec4<int32, P> const& b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tvec4<int32, P> Result(uninitialize); |
|
|
|
Result.data = _mm_or_si128(a.data, b.data); |
|
|
|
Result.data = _mm_or_si128(a.data, b.data); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
template <precision P> |
|
|
|
struct compute_vec4_xor<int, P> |
|
|
|
struct compute_vec4_or<uint32, P> |
|
|
|
{ |
|
|
|
{ |
|
|
|
static tvec4<int, P> call(tvec4<int, P> const& a, tvec4<int, P> const& b) |
|
|
|
static tvec4<uint32, P> call(tvec4<uint32, P> const& a, tvec4<uint32, P> const& b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
tvec4<int, P> Result(uninitialize); |
|
|
|
tvec4<uint32, P> Result(uninitialize); |
|
|
|
|
|
|
|
Result.data = _mm_or_si128(a.data, b.data); |
|
|
|
|
|
|
|
return Result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
|
|
|
|
struct compute_vec4_xor<int32, P> |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static tvec4<int32, P> call(tvec4<int32, P> const& a, tvec4<int32, P> const& b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tvec4<int32, P> Result(uninitialize); |
|
|
|
Result.data = _mm_xor_si128(a.data, b.data); |
|
|
|
Result.data = _mm_xor_si128(a.data, b.data); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
/* |
|
|
|
|
|
|
|
template <precision P> |
|
|
|
template <precision P> |
|
|
|
struct compute_vec4_shift_left<int, P> |
|
|
|
struct compute_vec4_xor<uint32, P> |
|
|
|
{ |
|
|
|
{ |
|
|
|
static tvec4<int, P> call(tvec4<int, P> const& a, tvec4<int, P> const& b) |
|
|
|
static tvec4<uint32, P> call(tvec4<uint32, P> const& a, tvec4<uint32, P> const& b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
tvec4<int, P> Result(uninitialize); |
|
|
|
tvec4<uint32, P> Result(uninitialize); |
|
|
|
|
|
|
|
Result.data = _mm_xor_si128(a.data, b.data); |
|
|
|
|
|
|
|
return Result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
|
|
|
|
struct compute_vec4_shift_left<int32, P> |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static tvec4<int32, P> call(tvec4<int32, P> const& a, tvec4<int32, P> const& b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tvec4<int32, P> Result(uninitialize); |
|
|
|
|
|
|
|
Result.data = _mm_sll_epi32(a.data, b.data); |
|
|
|
|
|
|
|
return Result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
|
|
|
|
struct compute_vec4_shift_left<uint32, P> |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static tvec4<uint32, P> call(tvec4<uint32, P> const& a, tvec4<uint32, P> const& b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tvec4<uint32, P> Result(uninitialize); |
|
|
|
Result.data = _mm_sll_epi32(a.data, b.data); |
|
|
|
Result.data = _mm_sll_epi32(a.data, b.data); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
template <precision P> |
|
|
|
struct compute_vec4_shift_right<int, P> |
|
|
|
struct compute_vec4_shift_right<int32, P> |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
static tvec4<int32, P> call(tvec4<int32, P> const& a, tvec4<int32, P> const& b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tvec4<int32, P> Result(uninitialize); |
|
|
|
|
|
|
|
Result.data = _mm_srl_epi32(a.data, b.data); |
|
|
|
|
|
|
|
return Result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <precision P> |
|
|
|
|
|
|
|
struct compute_vec4_shift_right<uint32, P> |
|
|
|
{ |
|
|
|
{ |
|
|
|
static tvec4<int, P> call(tvec4<int, P> const& a, tvec4<int, P> const& b) |
|
|
|
static tvec4<uint32, P> call(tvec4<uint32, P> const& a, tvec4<uint32, P> const& b) |
|
|
|
{ |
|
|
|
{ |
|
|
|
tvec4<int, P> Result(uninitialize); |
|
|
|
tvec4<uint32, P> Result(uninitialize); |
|
|
|
Result.data = _mm_srl_epi32(a.data, b.data); |
|
|
|
Result.data = _mm_srl_epi32(a.data, b.data); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
*/ |
|
|
|
|
|
|
|
}//namespace detail |
|
|
|
}//namespace detail |
|
|
|
|
|
|
|
|
|
|
|
# if !GLM_HAS_DEFAULTED_FUNCTIONS |
|
|
|
# if !GLM_HAS_DEFAULTED_FUNCTIONS |
|
|
|