performance fix.. still some issues left with equal_i1 for __vec8_i1

This commit is contained in:
evghenii
2013-09-18 19:14:41 +03:00
parent 4b1a0b4bc4
commit e4b1f58595

View File

@@ -480,46 +480,63 @@ INSERT_EXTRACT(__vec1_d, double)
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// mask ops // mask ops
static FORCEINLINE uint64_t __movmsk(__vec16_i1 mask) { static FORCEINLINE __vec16_i1 __movmsk(__vec16_i1 mask) {
return (uint64_t)mask.v; return _mm512_kmov(mask);
} }
static FORCEINLINE bool __any(__vec16_i1 mask) { static FORCEINLINE bool __any(__vec16_i1 mask) {
return (mask.v!=0); return !_mm512_kortestz(mask, mask);
} }
static FORCEINLINE bool __all(__vec16_i1 mask) { static FORCEINLINE bool __all(__vec16_i1 mask) {
return (mask.v==0xFFFF); return _mm512_kortestc(mask, mask);
} }
static FORCEINLINE bool __none(__vec16_i1 mask) { static FORCEINLINE bool __none(__vec16_i1 mask) {
return (mask.v==0); return _mm512_kortestz(mask, mask);
} }
#if 0
static FORCEINLINE __vec16_i1 __equal_i1(__vec16_i1 a, __vec16_i1 b) {
#if 0
return _mm512_kand(a,b); /* this fails some short circut tests */
#else
return _mm512_knot( _mm512_kandn(a, b)); /* this fails some asin test */
#endif
}
#else /* passes all the tests */
static FORCEINLINE __vec16_i1 __equal_i1(__vec16_i1 a, __vec16_i1 b) { static FORCEINLINE __vec16_i1 __equal_i1(__vec16_i1 a, __vec16_i1 b) {
__vec16_i1 r; __vec16_i1 r;
r.v = (a.v & b.v) | (~a.v & ~b.v); r.v = (a.v & b.v) | (~a.v & ~b.v);
return r; return r;
} }
#endif
static FORCEINLINE __vec16_i1 __and(__vec16_i1 a, __vec16_i1 b) { static FORCEINLINE __vec16_i1 __and(__vec16_i1 a, __vec16_i1 b) {
__vec16_i1 r; return _mm512_kand(a, b);
r.v = a.v & b.v;
return r;
} }
static FORCEINLINE __vec16_i1 __xor(__vec16_i1 a, __vec16_i1 b) { static FORCEINLINE __vec16_i1 __xor(__vec16_i1 a, __vec16_i1 b) {
__vec16_i1 r; return _mm512_kxor(a, b);
r.v = a.v ^ b.v;
return r;
} }
static FORCEINLINE __vec16_i1 __or(__vec16_i1 a, __vec16_i1 b) { static FORCEINLINE __vec16_i1 __or(__vec16_i1 a, __vec16_i1 b) {
__vec16_i1 r; return _mm512_kor(a, b);
r.v = a.v | b.v;
return r;
} }
#if 0
static FORCEINLINE __vec16_i1 __not(__vec16_i1 a) {
return _mm512_knot(a);
}
static FORCEINLINE __vec16_i1 __and_not1(__vec16_i1 a, __vec16_i1 b) {
return _mm512_kandn(a, b);
}
static FORCEINLINE __vec16_i1 __and_not2(__vec16_i1 a, __vec16_i1 b) {
return _mm512_kandnr(a, b);
}
#else
static FORCEINLINE __vec16_i1 __not(__vec16_i1 v) { static FORCEINLINE __vec16_i1 __not(__vec16_i1 v) {
__vec16_i1 r; __vec16_i1 r;
r.v = ~v.v; r.v = ~v.v;
@@ -537,18 +554,19 @@ static FORCEINLINE __vec16_i1 __and_not2(__vec16_i1 a, __vec16_i1 b) {
r.v = a.v & ~b.v; r.v = a.v & ~b.v;
return r; return r;
} }
#endif
static FORCEINLINE __vec16_i1 __select(__vec16_i1 mask, __vec16_i1 a, static FORCEINLINE __vec16_i1 __select(__vec16_i1 mask, __vec16_i1 a,
__vec16_i1 b) { __vec16_i1 b) {
__vec16_i1 r; return ((a & mask) | (b & ~mask));
r.v = (a.v & mask.v) | (b.v & ~mask.v); //return __or(__and(a, mask), __andnr(b, mask));
return r;
} }
static FORCEINLINE __vec16_i1 __select(bool cond, __vec16_i1 a, __vec16_i1 b) { static FORCEINLINE __vec16_i1 __select(bool cond, __vec16_i1 a, __vec16_i1 b) {
return cond ? a : b; return cond ? a : b;
} }
static FORCEINLINE bool __extract_element(__vec16_i1 vec, int index) { static FORCEINLINE bool __extract_element(__vec16_i1 vec, int index) {
return (vec.v & (1 << index)) ? true : false; return (vec.v & (1 << index)) ? true : false;
} }