Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/common/simd/vboolf16_avx512.h
9912 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#define vboolf vboolf_impl
7
#define vboold vboold_impl
8
#define vint vint_impl
9
#define vuint vuint_impl
10
#define vllong vllong_impl
11
#define vfloat vfloat_impl
12
#define vdouble vdouble_impl
13
14
namespace embree
15
{
16
/* 16-wide AVX-512 bool type */
17
template<>
18
struct vboolf<16>
19
{
20
typedef vboolf16 Bool;
21
typedef vint16 Int;
22
typedef vfloat16 Float;
23
24
enum { size = 16 }; // number of SIMD elements
25
__mmask16 v; // data
26
27
////////////////////////////////////////////////////////////////////////////////
28
/// Constructors, Assignment & Cast Operators
29
////////////////////////////////////////////////////////////////////////////////
30
31
__forceinline vboolf() {}
32
__forceinline vboolf(const vboolf16& t) { v = t.v; }
33
__forceinline vboolf16& operator =(const vboolf16& f) { v = f.v; return *this; }
34
35
__forceinline vboolf(const __mmask16& t) { v = t; }
36
__forceinline operator __mmask16() const { return v; }
37
38
__forceinline vboolf(bool b) { v = b ? 0xFFFF : 0x0000; }
39
__forceinline vboolf(int t) { v = (__mmask16)t; }
40
__forceinline vboolf(unsigned int t) { v = (__mmask16)t; }
41
42
/* return int8 mask */
43
__forceinline __m128i mask8() const {
44
return _mm_movm_epi8(v);
45
}
46
47
/* return int32 mask */
48
__forceinline __m512i mask32() const {
49
return _mm512_movm_epi32(v);
50
}
51
52
////////////////////////////////////////////////////////////////////////////////
53
/// Constants
54
////////////////////////////////////////////////////////////////////////////////
55
56
__forceinline vboolf(FalseTy) : v(0x0000) {}
57
__forceinline vboolf(TrueTy) : v(0xffff) {}
58
59
////////////////////////////////////////////////////////////////////////////////
60
/// Array Access
61
////////////////////////////////////////////////////////////////////////////////
62
63
__forceinline bool operator [](size_t index) const {
64
assert(index < 16); return (mm512_mask2int(v) >> index) & 1;
65
}
66
};
67
68
////////////////////////////////////////////////////////////////////////////////
69
/// Unary Operators
70
////////////////////////////////////////////////////////////////////////////////
71
72
__forceinline vboolf16 operator !(const vboolf16& a) { return _mm512_knot(a); }
73
74
////////////////////////////////////////////////////////////////////////////////
75
/// Binary Operators
76
////////////////////////////////////////////////////////////////////////////////
77
78
__forceinline vboolf16 operator &(const vboolf16& a, const vboolf16& b) { return _mm512_kand(a,b); }
79
__forceinline vboolf16 operator |(const vboolf16& a, const vboolf16& b) { return _mm512_kor(a,b); }
80
__forceinline vboolf16 operator ^(const vboolf16& a, const vboolf16& b) { return _mm512_kxor(a,b); }
81
82
__forceinline vboolf16 andn(const vboolf16& a, const vboolf16& b) { return _mm512_kandn(b,a); }
83
84
////////////////////////////////////////////////////////////////////////////////
85
/// Assignment Operators
86
////////////////////////////////////////////////////////////////////////////////
87
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; }
90
__forceinline vboolf16& operator ^=(vboolf16& a, const vboolf16& b) { return a = a ^ b; }
91
92
////////////////////////////////////////////////////////////////////////////////
93
/// Comparison Operators + Select
94
////////////////////////////////////////////////////////////////////////////////
95
96
__forceinline vboolf16 operator !=(const vboolf16& a, const vboolf16& b) { return _mm512_kxor(a, b); }
97
__forceinline vboolf16 operator ==(const vboolf16& a, const vboolf16& b) { return _mm512_kxnor(a, b); }
98
99
__forceinline vboolf16 select(const vboolf16& s, const vboolf16& a, const vboolf16& b) {
100
return _mm512_kor(_mm512_kand(s,a),_mm512_kandn(s,b));
101
}
102
103
////////////////////////////////////////////////////////////////////////////////
104
/// Reduction Operations
105
////////////////////////////////////////////////////////////////////////////////
106
107
__forceinline int all (const vboolf16& a) { return _mm512_kortestc(a,a) != 0; }
108
__forceinline int any (const vboolf16& a) { return _mm512_kortestz(a,a) == 0; }
109
__forceinline int none(const vboolf16& a) { return _mm512_kortestz(a,a) != 0; }
110
111
__forceinline int all (const vboolf16& valid, const vboolf16& b) { return all((!valid) | b); }
112
__forceinline int any (const vboolf16& valid, const vboolf16& b) { return any(valid & b); }
113
__forceinline int none(const vboolf16& valid, const vboolf16& b) { return none(valid & b); }
114
115
__forceinline size_t movemask(const vboolf16& a) { return _mm512_kmov(a); }
116
__forceinline size_t popcnt (const vboolf16& a) { return popcnt(a.v); }
117
118
////////////////////////////////////////////////////////////////////////////////
119
/// Conversion Operations
120
////////////////////////////////////////////////////////////////////////////////
121
122
__forceinline unsigned int toInt (const vboolf16& a) { return mm512_mask2int(a); }
123
__forceinline vboolf16 toMask(const int& a) { return mm512_int2mask(a); }
124
125
////////////////////////////////////////////////////////////////////////////////
126
/// Get/Set Functions
127
////////////////////////////////////////////////////////////////////////////////
128
129
__forceinline bool get(const vboolf16& a, size_t index) { assert(index < 16); return (toInt(a) >> index) & 1; }
130
__forceinline void set(vboolf16& a, size_t index) { assert(index < 16); a |= 1 << index; }
131
__forceinline void clear(vboolf16& a, size_t index) { assert(index < 16); a = andn(a, 1 << index); }
132
133
////////////////////////////////////////////////////////////////////////////////
134
/// Output Operators
135
////////////////////////////////////////////////////////////////////////////////
136
137
__forceinline embree_ostream operator <<(embree_ostream cout, const vboolf16& a)
138
{
139
cout << "<";
140
for (size_t i=0; i<16; i++) {
141
if ((a.v >> i) & 1) cout << "1"; else cout << "0";
142
}
143
return cout << ">";
144
}
145
}
146
147
#undef vboolf
148
#undef vboold
149
#undef vint
150
#undef vuint
151
#undef vllong
152
#undef vfloat
153
#undef vdouble
154
155