ad837a5156906ae7665c7919643655972a101e79
[mesa.git] / src / compiler / nir / nir_builtin_builder.h
1 /*
2 * Copyright © 2018 Red Hat Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #ifndef NIR_BUILTIN_BUILDER_H
25 #define NIR_BUILTIN_BUILDER_H
26
27 #include "util/u_math.h"
28 #include "nir_builder.h"
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 /*
35 * Functions are sorted alphabetically with removed type and "fast" prefix.
36 * Definitions for functions in the C file come first.
37 */
38
39 nir_ssa_def* nir_cross3(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);
40 nir_ssa_def* nir_cross4(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);
41 nir_ssa_def* nir_length(nir_builder *b, nir_ssa_def *vec);
42 nir_ssa_def* nir_fast_length(nir_builder *b, nir_ssa_def *vec);
43 nir_ssa_def* nir_nextafter(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);
44 nir_ssa_def* nir_normalize(nir_builder *b, nir_ssa_def *vec);
45 nir_ssa_def* nir_rotate(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);
46 nir_ssa_def* nir_smoothstep(nir_builder *b, nir_ssa_def *edge0,
47 nir_ssa_def *edge1, nir_ssa_def *x);
48 nir_ssa_def* nir_upsample(nir_builder *b, nir_ssa_def *hi, nir_ssa_def *lo);
49 nir_ssa_def* nir_atan(nir_builder *b, nir_ssa_def *y_over_x);
50 nir_ssa_def* nir_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x);
51
52 nir_ssa_def *
53 nir_get_texture_lod(nir_builder *b, nir_tex_instr *tex);
54
55 nir_ssa_def *
56 nir_get_texture_size(nir_builder *b, nir_tex_instr *tex);
57
58 static inline nir_ssa_def *
59 nir_nan_check2(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *res)
60 {
61 return nir_bcsel(b, nir_fne(b, x, x), x, nir_bcsel(b, nir_fne(b, y, y), y, res));
62 }
63
64 static inline nir_ssa_def *
65 nir_fmax_abs_vec_comp(nir_builder *b, nir_ssa_def *vec)
66 {
67 nir_ssa_def *res = nir_channel(b, vec, 0);
68 for (unsigned i = 1; i < vec->num_components; ++i)
69 res = nir_fmax(b, res, nir_fabs(b, nir_channel(b, vec, i)));
70 return res;
71 }
72
73 static inline nir_ssa_def *
74 nir_iabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
75 {
76 nir_ssa_def *cond = nir_ige(b, x, y);
77 nir_ssa_def *res0 = nir_isub(b, x, y);
78 nir_ssa_def *res1 = nir_isub(b, y, x);
79 return nir_bcsel(b, cond, res0, res1);
80 }
81
82 static inline nir_ssa_def *
83 nir_uabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
84 {
85 nir_ssa_def *cond = nir_uge(b, x, y);
86 nir_ssa_def *res0 = nir_isub(b, x, y);
87 nir_ssa_def *res1 = nir_isub(b, y, x);
88 return nir_bcsel(b, cond, res0, res1);
89 }
90
91 static inline nir_ssa_def *
92 nir_fexp(nir_builder *b, nir_ssa_def *x)
93 {
94 return nir_fexp2(b, nir_fmul_imm(b, x, M_LOG2E));
95 }
96
97 static inline nir_ssa_def *
98 nir_flog(nir_builder *b, nir_ssa_def *x)
99 {
100 return nir_fmul_imm(b, nir_flog2(b, x), 1.0 / M_LOG2E);
101 }
102
103 static inline nir_ssa_def *
104 nir_umul24(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
105 {
106 nir_ssa_def *mask = nir_imm_int(b, 0xffffff);
107 nir_ssa_def *x_24 = nir_iand(b, x, mask);
108 nir_ssa_def *y_24 = nir_iand(b, y, mask);
109 return nir_imul(b, x_24, y_24);
110 }
111
112 static inline nir_ssa_def *
113 nir_umad24(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)
114 {
115 nir_ssa_def *temp = nir_umul24(b, x, y);
116 return nir_iadd(b, temp, z);
117 }
118
119 static inline nir_ssa_def *
120 nir_imad24(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)
121 {
122 nir_ssa_def *temp = nir_imul24(b, x, y);
123 return nir_iadd(b, temp, z);
124 }
125
126 static inline nir_ssa_def *
127 nir_imad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)
128 {
129 nir_ssa_def *temp = nir_imul_high(b, x, y);
130 return nir_iadd(b, temp, z);
131 }
132
133 static inline nir_ssa_def *
134 nir_umad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)
135 {
136 nir_ssa_def *temp = nir_umul_high(b, x, y);
137 return nir_iadd(b, temp, z);
138 }
139
140 static inline nir_ssa_def *
141 nir_bitselect(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s)
142 {
143 return nir_ior(b, nir_iand(b, nir_inot(b, s), x), nir_iand(b, s, y));
144 }
145
146 static inline nir_ssa_def *
147 nir_fclamp(nir_builder *b,
148 nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
149 {
150 return nir_fmin(b, nir_fmax(b, x, min_val), max_val);
151 }
152
153 static inline nir_ssa_def *
154 nir_iclamp(nir_builder *b,
155 nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
156 {
157 return nir_imin(b, nir_imax(b, x, min_val), max_val);
158 }
159
160 static inline nir_ssa_def *
161 nir_uclamp(nir_builder *b,
162 nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
163 {
164 return nir_umin(b, nir_umax(b, x, min_val), max_val);
165 }
166
167 static inline nir_ssa_def *
168 nir_copysign(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
169 {
170 uint64_t masks = 1ull << (x->bit_size - 1);
171 uint64_t maskv = ~masks;
172
173 nir_ssa_def *s = nir_imm_intN_t(b, masks, x->bit_size);
174 nir_ssa_def *v = nir_imm_intN_t(b, maskv, x->bit_size);
175
176 return nir_ior(b, nir_iand(b, x, v), nir_iand(b, y, s));
177 }
178
179 static inline nir_ssa_def *
180 nir_degrees(nir_builder *b, nir_ssa_def *val)
181 {
182 return nir_fmul_imm(b, val, 180.0 / M_PI);
183 }
184
185 static inline nir_ssa_def *
186 nir_fdim(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
187 {
188 nir_ssa_def *cond = nir_flt(b, y, x);
189 nir_ssa_def *res = nir_fsub(b, x, y);
190 nir_ssa_def *zero = nir_imm_floatN_t(b, 0.0, x->bit_size);
191
192 // return NaN if either x or y are NaN, else x-y if x>y, else +0.0
193 return nir_nan_check2(b, x, y, nir_bcsel(b, cond, res, zero));
194 }
195
196 static inline nir_ssa_def *
197 nir_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
198 {
199 return nir_length(b, nir_fsub(b, x, y));
200 }
201
202 static inline nir_ssa_def *
203 nir_fast_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
204 {
205 return nir_fast_length(b, nir_fsub(b, x, y));
206 }
207
208 static inline nir_ssa_def*
209 nir_fast_normalize(nir_builder *b, nir_ssa_def *vec)
210 {
211 return nir_fdiv(b, vec, nir_fast_length(b, vec));
212 }
213
214 static inline nir_ssa_def*
215 nir_fmad(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)
216 {
217 return nir_fadd(b, nir_fmul(b, x, y), z);
218 }
219
220 static inline nir_ssa_def*
221 nir_maxmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
222 {
223 nir_ssa_def *xabs = nir_fabs(b, x);
224 nir_ssa_def *yabs = nir_fabs(b, y);
225
226 nir_ssa_def *condy = nir_flt(b, xabs, yabs);
227 nir_ssa_def *condx = nir_flt(b, yabs, xabs);
228
229 return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmax(b, x, y)));
230 }
231
232 static inline nir_ssa_def*
233 nir_minmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
234 {
235 nir_ssa_def *xabs = nir_fabs(b, x);
236 nir_ssa_def *yabs = nir_fabs(b, y);
237
238 nir_ssa_def *condx = nir_flt(b, xabs, yabs);
239 nir_ssa_def *condy = nir_flt(b, yabs, xabs);
240
241 return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmin(b, x, y)));
242 }
243
244 static inline nir_ssa_def*
245 nir_nan(nir_builder *b, nir_ssa_def *x)
246 {
247 nir_ssa_def *nan = nir_imm_floatN_t(b, NAN, x->bit_size);
248 if (x->num_components == 1)
249 return nan;
250
251 nir_ssa_def *nans[NIR_MAX_VEC_COMPONENTS];
252 for (unsigned i = 0; i < x->num_components; ++i)
253 nans[i] = nan;
254
255 return nir_vec(b, nans, x->num_components);
256 }
257
258 static inline nir_ssa_def *
259 nir_radians(nir_builder *b, nir_ssa_def *val)
260 {
261 return nir_fmul_imm(b, val, M_PI / 180.0);
262 }
263
264 static inline nir_ssa_def *
265 nir_select(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s)
266 {
267 if (s->num_components != 1) {
268 uint64_t mask = 1ull << (s->bit_size - 1);
269 s = nir_iand(b, s, nir_imm_intN_t(b, mask, s->bit_size));
270 }
271 return nir_bcsel(b, nir_ieq(b, s, nir_imm_intN_t(b, 0, s->bit_size)), x, y);
272 }
273
274 static inline nir_ssa_def *
275 nir_clz_u(nir_builder *b, nir_ssa_def *a)
276 {
277 nir_ssa_def *val;
278 val = nir_isub(b, nir_imm_intN_t(b, a->bit_size - 1, 32), nir_ufind_msb(b, a));
279 return nir_u2u(b, val, a->bit_size);
280 }
281
282 #ifdef __cplusplus
283 }
284 #endif
285
286 #endif /* NIR_BUILTIN_BUILDER_H */