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:
@@ -55,6 +55,7 @@ typedef int64_t __vec1_i64;
|
||||
|
||||
struct __vec16_i1 {
|
||||
__vec16_i1() { }
|
||||
__vec16_i1(const uint16_t &vv) : v(vv) { }
|
||||
__vec16_i1(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3,
|
||||
uint32_t v4, uint32_t v5, uint32_t v6, uint32_t v7,
|
||||
uint32_t v8, uint32_t v9, uint32_t v10, uint32_t v11,
|
||||
@@ -342,6 +343,18 @@ static FORCEINLINE uint64_t __movmsk(__vec16_i1 mask) {
|
||||
return (uint64_t)mask.v;
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __any(__vec16_i1 mask) {
|
||||
return (mask.v!=0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __all(__vec16_i1 mask) {
|
||||
return (mask.v==0xFFFF);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __none(__vec16_i1 mask) {
|
||||
return (mask.v==0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __equal_i1(__vec16_i1 a, __vec16_i1 b) {
|
||||
__vec16_i1 r;
|
||||
r.v = (a.v & b.v) | (~a.v & ~b.v);
|
||||
|
||||
@@ -55,6 +55,7 @@ typedef int64_t __vec1_i64;
|
||||
|
||||
struct __vec32_i1 {
|
||||
__vec32_i1() { }
|
||||
__vec32_i1(const uint32_t &vv) : v(vv) { }
|
||||
__vec32_i1(uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3,
|
||||
uint32_t v4, uint32_t v5, uint32_t v6, uint32_t v7,
|
||||
uint32_t v8, uint32_t v9, uint32_t v10, uint32_t v11,
|
||||
@@ -407,6 +408,18 @@ static FORCEINLINE uint64_t __movmsk(__vec32_i1 mask) {
|
||||
return (uint64_t)mask.v;
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec32_i1 __any(__vec32_i1 mask) {
|
||||
return (mask.v!=0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec32_i1 __all(__vec32_i1 mask) {
|
||||
return (mask.v==0xFFFFFFFF);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec32_i1 __none(__vec32_i1 mask) {
|
||||
return (mask.v==0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec32_i1 __equal_i1(__vec32_i1 a, __vec32_i1 b) {
|
||||
__vec32_i1 r;
|
||||
r.v = (a.v & b.v) | (~a.v & ~b.v);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -428,6 +428,18 @@ static FORCEINLINE __vec16_i1 __movmsk(__vec16_i1 mask) {
|
||||
return _mm512_kmov(mask);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __any(__vec16_i1 mask) {
|
||||
return (mask!=0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __all(__vec16_i1 mask) {
|
||||
return (mask=0xFFFF);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __none(__vec16_i1 mask) {
|
||||
return (mask==0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec16_i1 __equal_i1(__vec16_i1 a, __vec16_i1 b) {
|
||||
return _mm512_knot( _mm512_kandn(a, b));
|
||||
}
|
||||
|
||||
@@ -297,6 +297,18 @@ static FORCEINLINE uint32_t __movmsk(__vec32_i1 mask) {
|
||||
return ((m1<<16)|m2);
|
||||
}
|
||||
|
||||
static FORCEINLINE uint32_t __any(__vec32_i1 mask) {
|
||||
return (mask.m!=0);
|
||||
}
|
||||
|
||||
static FORCEINLINE uint32_t __all(__vec32_i1 mask) {
|
||||
return (mask.m==0xFFFFFFFF);
|
||||
}
|
||||
|
||||
static FORCEINLINE uint32_t __none(__vec32_i1 mask) {
|
||||
return (mask.m==0x0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec32_i1 __equal(__vec32_i1 a, __vec32_i1 b) {
|
||||
__vec32_i1 ret;
|
||||
ret.m16.m1 = _mm512_knot(_mm512_kandn(a.m16.m1, b.m16.m1));
|
||||
|
||||
@@ -269,6 +269,18 @@ static FORCEINLINE uint64_t __movmsk(__vec4_i1 mask) {
|
||||
return (uint64_t)_mm_movemask_ps(mask.v);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec4_i1 __any(__vec4_i1 mask) {
|
||||
return (_mm_movemask_ps(mask.v)!=0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec4_i1 __all(__vec4_i1 mask) {
|
||||
return (_mm_movemask_ps(mask.v)=0xF);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec4_i1 __none(__vec4_i1 mask) {
|
||||
return (_mm_movemask_ps(mask.v)==0);
|
||||
}
|
||||
|
||||
static FORCEINLINE __vec4_i1 __equal_i1(__vec4_i1 a, __vec4_i1 b) {
|
||||
return _mm_cmpeq_epi32(_mm_castps_si128(a.v), _mm_castps_si128(b.v));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user