Path: blob/master/thirdparty/embree/common/simd/vboolf16_avx512.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#define vboolf vboolf_impl6#define vboold vboold_impl7#define vint vint_impl8#define vuint vuint_impl9#define vllong vllong_impl10#define vfloat vfloat_impl11#define vdouble vdouble_impl1213namespace embree14{15/* 16-wide AVX-512 bool type */16template<>17struct vboolf<16>18{19typedef vboolf16 Bool;20typedef vint16 Int;21typedef vfloat16 Float;2223enum { size = 16 }; // number of SIMD elements24__mmask16 v; // data2526////////////////////////////////////////////////////////////////////////////////27/// Constructors, Assignment & Cast Operators28////////////////////////////////////////////////////////////////////////////////2930__forceinline vboolf() {}31__forceinline vboolf(const vboolf16& t) { v = t.v; }32__forceinline vboolf16& operator =(const vboolf16& f) { v = f.v; return *this; }3334__forceinline vboolf(const __mmask16& t) { v = t; }35__forceinline operator __mmask16() const { return v; }3637__forceinline vboolf(bool b) { v = b ? 0xFFFF : 0x0000; }38__forceinline vboolf(int t) { v = (__mmask16)t; }39__forceinline vboolf(unsigned int t) { v = (__mmask16)t; }4041/* return int8 mask */42__forceinline __m128i mask8() const {43return _mm_movm_epi8(v);44}4546/* return int32 mask */47__forceinline __m512i mask32() const {48return _mm512_movm_epi32(v);49}5051////////////////////////////////////////////////////////////////////////////////52/// Constants53////////////////////////////////////////////////////////////////////////////////5455__forceinline vboolf(FalseTy) : v(0x0000) {}56__forceinline vboolf(TrueTy) : v(0xffff) {}5758////////////////////////////////////////////////////////////////////////////////59/// Array Access60////////////////////////////////////////////////////////////////////////////////6162__forceinline bool operator [](size_t index) const {63assert(index < 16); return (mm512_mask2int(v) >> index) & 1;64}65};6667////////////////////////////////////////////////////////////////////////////////68/// Unary Operators69////////////////////////////////////////////////////////////////////////////////7071__forceinline vboolf16 operator !(const vboolf16& a) { return _mm512_knot(a); }7273////////////////////////////////////////////////////////////////////////////////74/// Binary Operators75////////////////////////////////////////////////////////////////////////////////7677__forceinline vboolf16 operator &(const vboolf16& a, const vboolf16& b) { return _mm512_kand(a,b); }78__forceinline vboolf16 operator |(const vboolf16& a, const vboolf16& b) { return _mm512_kor(a,b); }79__forceinline vboolf16 operator ^(const vboolf16& a, const vboolf16& b) { return _mm512_kxor(a,b); }8081__forceinline vboolf16 andn(const vboolf16& a, const vboolf16& b) { return _mm512_kandn(b,a); }8283////////////////////////////////////////////////////////////////////////////////84/// Assignment Operators85////////////////////////////////////////////////////////////////////////////////8687__forceinline vboolf16& operator &=(vboolf16& a, const vboolf16& b) { return a = a & b; }88__forceinline vboolf16& operator |=(vboolf16& a, const vboolf16& b) { return a = a | b; }89__forceinline vboolf16& operator ^=(vboolf16& a, const vboolf16& b) { return a = a ^ b; }9091////////////////////////////////////////////////////////////////////////////////92/// Comparison Operators + Select93////////////////////////////////////////////////////////////////////////////////9495__forceinline vboolf16 operator !=(const vboolf16& a, const vboolf16& b) { return _mm512_kxor(a, b); }96__forceinline vboolf16 operator ==(const vboolf16& a, const vboolf16& b) { return _mm512_kxnor(a, b); }9798__forceinline vboolf16 select(const vboolf16& s, const vboolf16& a, const vboolf16& b) {99return _mm512_kor(_mm512_kand(s,a),_mm512_kandn(s,b));100}101102////////////////////////////////////////////////////////////////////////////////103/// Reduction Operations104////////////////////////////////////////////////////////////////////////////////105106__forceinline int all (const vboolf16& a) { return _mm512_kortestc(a,a) != 0; }107__forceinline int any (const vboolf16& a) { return _mm512_kortestz(a,a) == 0; }108__forceinline int none(const vboolf16& a) { return _mm512_kortestz(a,a) != 0; }109110__forceinline int all (const vboolf16& valid, const vboolf16& b) { return all((!valid) | b); }111__forceinline int any (const vboolf16& valid, const vboolf16& b) { return any(valid & b); }112__forceinline int none(const vboolf16& valid, const vboolf16& b) { return none(valid & b); }113114__forceinline size_t movemask(const vboolf16& a) { return _mm512_kmov(a); }115__forceinline size_t popcnt (const vboolf16& a) { return popcnt(a.v); }116117////////////////////////////////////////////////////////////////////////////////118/// Conversion Operations119////////////////////////////////////////////////////////////////////////////////120121__forceinline unsigned int toInt (const vboolf16& a) { return mm512_mask2int(a); }122__forceinline vboolf16 toMask(const int& a) { return mm512_int2mask(a); }123124////////////////////////////////////////////////////////////////////////////////125/// Get/Set Functions126////////////////////////////////////////////////////////////////////////////////127128__forceinline bool get(const vboolf16& a, size_t index) { assert(index < 16); return (toInt(a) >> index) & 1; }129__forceinline void set(vboolf16& a, size_t index) { assert(index < 16); a |= 1 << index; }130__forceinline void clear(vboolf16& a, size_t index) { assert(index < 16); a = andn(a, 1 << index); }131132////////////////////////////////////////////////////////////////////////////////133/// Output Operators134////////////////////////////////////////////////////////////////////////////////135136__forceinline embree_ostream operator <<(embree_ostream cout, const vboolf16& a)137{138cout << "<";139for (size_t i=0; i<16; i++) {140if ((a.v >> i) & 1) cout << "1"; else cout << "0";141}142return cout << ">";143}144}145146#undef vboolf147#undef vboold148#undef vint149#undef vuint150#undef vllong151#undef vfloat152#undef vdouble153154155