|
|
|
@ -858,7 +858,7 @@ namespace findMSB |
|
|
|
|
int Error(0); |
|
|
|
|
|
|
|
|
|
Error += perf_950(); |
|
|
|
|
Error += perf_ops(); |
|
|
|
|
//Error += perf_ops();
|
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
@ -1190,17 +1190,44 @@ namespace bitCount |
|
|
|
|
return Count; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
inline int bitCount_bits(T v) |
|
|
|
|
template <bool EXEC = false> |
|
|
|
|
struct compute_bitfieldBitCountStep |
|
|
|
|
{ |
|
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_integer, "'bitCount' only accept integer values"); |
|
|
|
|
template <typename T, glm::precision P, template <class, glm::precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T, T) |
|
|
|
|
{ |
|
|
|
|
return v; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
int Count(0); |
|
|
|
|
for(T i = 0, n = static_cast<T>(sizeof(T) * 8); i < n; ++i) |
|
|
|
|
template <> |
|
|
|
|
struct compute_bitfieldBitCountStep<true> |
|
|
|
|
{ |
|
|
|
|
template <typename T, glm::precision P, template <class, glm::precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & v, T Mask, T Shift) |
|
|
|
|
{ |
|
|
|
|
Count += static_cast<int>((v >> i) & static_cast<T>(1)); |
|
|
|
|
return (v & Mask) + ((v >> Shift) & Mask); |
|
|
|
|
} |
|
|
|
|
return Count; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <typename T, glm::precision P, template <typename, glm::precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<int, P> bitCount_bitfield(vecType<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
typedef glm::detail::make_unsigned<T>::type U; |
|
|
|
|
vecType<U, P> x(*reinterpret_cast<vecType<U, P> const *>(&v)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 2>::call<U, P, vecType>(x, U(0x5555555555555555ull), static_cast<U>( 1)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 4>::call<U, P, vecType>(x, U(0x3333333333333333ull), static_cast<U>( 2)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 8>::call<U, P, vecType>(x, U(0x0F0F0F0F0F0F0F0Full), static_cast<U>( 4)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 16>::call<U, P, vecType>(x, U(0x00FF00FF00FF00FFull), static_cast<U>( 8)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 32>::call<U, P, vecType>(x, U(0x0000FFFF0000FFFFull), static_cast<U>(16)); |
|
|
|
|
x = compute_bitfieldBitCountStep<sizeof(T) * 8 >= 64>::call<U, P, vecType>(x, U(0x00000000FFFFFFFFull), static_cast<U>(32)); |
|
|
|
|
return vecType<int, P>(x); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER int bitCount_bitfield(genType x) |
|
|
|
|
{ |
|
|
|
|
return bitCount_bitfield(glm::tvec1<genType, glm::defaultp>(x)).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int perf() |
|
|
|
@ -1249,15 +1276,18 @@ namespace bitCount |
|
|
|
|
|
|
|
|
|
std::clock_t TimestampsE = std::clock(); |
|
|
|
|
|
|
|
|
|
std::clock_t TimeIf = TimestampsB - TimestampsA; |
|
|
|
|
std::clock_t TimeVec = TimestampsC - TimestampsB; |
|
|
|
|
std::clock_t TimeDefault = TimestampsD - TimestampsC; |
|
|
|
|
std::clock_t TimeVec4 = TimestampsE - TimestampsD; |
|
|
|
|
{ |
|
|
|
|
for(std::size_t i = 0, n = v.size(); i < n; ++i) |
|
|
|
|
v[i] = bitCount_bitfield(static_cast<int>(i)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::clock_t TimestampsF = std::clock(); |
|
|
|
|
|
|
|
|
|
std::printf("bitCount - TimeIf %d\n", static_cast<unsigned int>(TimeIf)); |
|
|
|
|
std::printf("bitCount - TimeVec %d\n", static_cast<unsigned int>(TimeVec)); |
|
|
|
|
std::printf("bitCount - TimeDefault %d\n", static_cast<unsigned int>(TimeDefault)); |
|
|
|
|
std::printf("bitCount - TimeVec4 %d\n", static_cast<unsigned int>(TimeVec4)); |
|
|
|
|
std::printf("bitCount - TimeIf %d\n", static_cast<unsigned int>(TimestampsB - TimestampsA)); |
|
|
|
|
std::printf("bitCount - TimeVec %d\n", static_cast<unsigned int>(TimestampsC - TimestampsB)); |
|
|
|
|
std::printf("bitCount - TimeDefault %d\n", static_cast<unsigned int>(TimestampsD - TimestampsC)); |
|
|
|
|
std::printf("bitCount - TimeVec4 %d\n", static_cast<unsigned int>(TimestampsE - TimestampsD)); |
|
|
|
|
std::printf("bitCount - bitfield %d\n", static_cast<unsigned int>(TimestampsF - TimestampsE)); |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
@ -1268,8 +1298,16 @@ namespace bitCount |
|
|
|
|
|
|
|
|
|
for(std::size_t i = 0, n = sizeof(DataI32) / sizeof(type<int>); i < n; ++i) |
|
|
|
|
{ |
|
|
|
|
int Result = glm::bitCount(DataI32[i].Value); |
|
|
|
|
Error += DataI32[i].Return == Result ? 0 : 1; |
|
|
|
|
int ResultA = glm::bitCount(DataI32[i].Value); |
|
|
|
|
int ResultB = bitCount_if(DataI32[i].Value); |
|
|
|
|
int ResultC = bitCount_vec(DataI32[i].Value); |
|
|
|
|
int ResultE = bitCount_bitfield(DataI32[i].Value); |
|
|
|
|
|
|
|
|
|
Error += DataI32[i].Return == ResultA ? 0 : 1; |
|
|
|
|
Error += DataI32[i].Return == ResultB ? 0 : 1; |
|
|
|
|
Error += DataI32[i].Return == ResultC ? 0 : 1; |
|
|
|
|
Error += DataI32[i].Return == ResultE ? 0 : 1; |
|
|
|
|
|
|
|
|
|
assert(!Error); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1281,6 +1319,8 @@ int main() |
|
|
|
|
{ |
|
|
|
|
int Error = 0; |
|
|
|
|
|
|
|
|
|
Error += ::bitCount::test(); |
|
|
|
|
Error += ::bitCount::perf(); |
|
|
|
|
Error += ::bitfieldReverse::test(); |
|
|
|
|
Error += ::bitfieldReverse::perf(); |
|
|
|
|
Error += ::findMSB::test(); |
|
|
|
@ -1292,8 +1332,6 @@ int main() |
|
|
|
|
Error += ::usubBorrow::test(); |
|
|
|
|
Error += ::bitfieldInsert::test(); |
|
|
|
|
Error += ::bitfieldExtract::test(); |
|
|
|
|
Error += ::bitCount::test(); |
|
|
|
|
Error += ::bitCount::perf(); |
|
|
|
|
|
|
|
|
|
return Error; |
|
|
|
|
} |
|
|
|
|