Added the following mask tests: __any(), __all(), __none() for all supported targets.

This allows for more efficient code generation of KNC.
This commit is contained in:
Jean-Luc Duprat
2012-09-14 11:06:18 -07:00
parent 4ecdbe4bd9
commit f0b0618484
15 changed files with 355 additions and 13 deletions

View File

@@ -55,6 +55,7 @@ typedef int64_t __vec1_i64;
struct __vec64_i1 {
__vec64_i1() { }
__vec64_i1(const uint64_t &vv) : v(vv) { }
__vec64_i1(uint64_t v0, uint64_t v1, uint64_t v2, uint64_t v3,
uint64_t v4, uint64_t v5, uint64_t v6, uint64_t v7,
uint64_t v8, uint64_t v9, uint64_t v10, uint64_t v11,
@@ -532,6 +533,18 @@ static FORCEINLINE uint64_t __movmsk(__vec64_i1 mask) {
return (uint64_t)mask.v;
}
static FORCEINLINE __vec64_i1 __any(__vec64_i1 mask) {
return (mask.v!=0);
}
static FORCEINLINE __vec64_i1 __all(__vec64_i1 mask) {
return (mask.v==0xFFFFFFFFFFFFFFFF);
}
static FORCEINLINE __vec64_i1 __none(__vec64_i1 mask) {
return (mask.v==0);
}
static FORCEINLINE __vec64_i1 __equal_i1(__vec64_i1 a, __vec64_i1 b) {
__vec64_i1 r;
r.v = (a.v & b.v) | (~a.v & ~b.v);