Add count_{leading,trailing}_zeros() functions to stdlib.

(Documentation is still yet to be written.)
This commit is contained in:
Matt Pharr
2011-11-30 10:12:16 -08:00
parent 1703f2717c
commit 7a2561c429
9 changed files with 192 additions and 6 deletions

View File

@@ -315,6 +315,113 @@ static inline uniform int lanemask() {
return __movmsk(__mask);
}
///////////////////////////////////////////////////////////////////////////
// count leading/trailing zeros
static inline uniform unsigned int32
count_leading_zeros(uniform unsigned int32 v) {
return __count_leading_zeros_i32(v);
}
static inline uniform unsigned int64
count_leading_zeros(uniform unsigned int64 v) {
return __count_leading_zeros_i64(v);
}
static inline uniform unsigned int32
count_trailing_zeros(uniform unsigned int32 v) {
return __count_trailing_zeros_i32(v);
}
static inline uniform unsigned int64
count_trailing_zeros(uniform unsigned int64 v) {
return __count_trailing_zeros_i64(v);
}
static inline uniform int32
count_leading_zeros(uniform int32 v) {
return __count_leading_zeros_i32(v);
}
static inline uniform int64
count_leading_zeros(uniform int64 v) {
return __count_leading_zeros_i64(v);
}
static inline uniform int32
count_trailing_zeros(uniform int32 v) {
return __count_trailing_zeros_i32(v);
}
static inline uniform int64
count_trailing_zeros(uniform int64 v) {
return __count_trailing_zeros_i64(v);
}
static inline unsigned int32
count_leading_zeros(unsigned int32 v) {
unsigned int32 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_leading_zeros_i32(extract(v, i)));
return r;
}
static inline unsigned int64
count_leading_zeros(unsigned int64 v) {
unsigned int64 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_leading_zeros_i64(extract(v, i)));
return r;
}
static inline unsigned int32
count_trailing_zeros(unsigned int32 v) {
unsigned int32 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_trailing_zeros_i32(extract(v, i)));
return r;
}
static inline unsigned int64
count_trailing_zeros(unsigned int64 v) {
unsigned int64 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_trailing_zeros_i64(extract(v, i)));
return r;
}
static inline int32
count_leading_zeros(int32 v) {
int32 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_leading_zeros_i32(extract(v, i)));
return r;
}
static inline int64
count_leading_zeros(int64 v) {
int64 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_leading_zeros_i64(extract(v, i)));
return r;
}
static inline int32
count_trailing_zeros(int32 v) {
int32 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_trailing_zeros_i32(extract(v, i)));
return r;
}
static inline int64
count_trailing_zeros(int64 v) {
int64 r;
for (uniform int i = 0; i < programCount; ++i)
r = insert(r, i, __count_trailing_zeros_i64(extract(v, i)));
return r;
}
///////////////////////////////////////////////////////////////////////////
// AOS/SOA conversion