2 * Copyright © 2018 Red Hat Inc.
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:
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
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
24 #ifndef NIR_BUILTIN_BUILDER_H
25 #define NIR_BUILTIN_BUILDER_H
27 #include "util/u_math.h"
28 #include "nir_builder.h"
35 * Functions are sorted alphabetically with removed type and "fast" prefix.
36 * Definitions for functions in the C file come first.
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
);
53 nir_get_texture_lod(nir_builder
*b
, nir_tex_instr
*tex
);
56 nir_get_texture_size(nir_builder
*b
, nir_tex_instr
*tex
);
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
)
61 return nir_bcsel(b
, nir_fne(b
, x
, x
), x
, nir_bcsel(b
, nir_fne(b
, y
, y
), y
, res
));
64 static inline nir_ssa_def
*
65 nir_fmax_abs_vec_comp(nir_builder
*b
, nir_ssa_def
*vec
)
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
)));
73 static inline nir_ssa_def
*
74 nir_iabs_diff(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
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
);
82 static inline nir_ssa_def
*
83 nir_uabs_diff(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
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
);
91 static inline nir_ssa_def
*
92 nir_fexp(nir_builder
*b
, nir_ssa_def
*x
)
94 return nir_fexp2(b
, nir_fmul_imm(b
, x
, M_LOG2E
));
97 static inline nir_ssa_def
*
98 nir_flog(nir_builder
*b
, nir_ssa_def
*x
)
100 return nir_fmul_imm(b
, nir_flog2(b
, x
), 1.0 / M_LOG2E
);
103 static inline nir_ssa_def
*
104 nir_umul24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
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
);
112 static inline nir_ssa_def
*
113 nir_umad24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
115 nir_ssa_def
*temp
= nir_umul24(b
, x
, y
);
116 return nir_iadd(b
, temp
, z
);
119 static inline nir_ssa_def
*
120 nir_imad24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
122 nir_ssa_def
*temp
= nir_imul24(b
, x
, y
);
123 return nir_iadd(b
, temp
, z
);
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
)
129 nir_ssa_def
*temp
= nir_imul_high(b
, x
, y
);
130 return nir_iadd(b
, temp
, z
);
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
)
136 nir_ssa_def
*temp
= nir_umul_high(b
, x
, y
);
137 return nir_iadd(b
, temp
, z
);
140 static inline nir_ssa_def
*
141 nir_bitselect(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*s
)
143 return nir_ior(b
, nir_iand(b
, nir_inot(b
, s
), x
), nir_iand(b
, s
, y
));
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
)
150 return nir_fmin(b
, nir_fmax(b
, x
, min_val
), max_val
);
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
)
157 return nir_imin(b
, nir_imax(b
, x
, min_val
), max_val
);
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
)
164 return nir_umin(b
, nir_umax(b
, x
, min_val
), max_val
);
167 static inline nir_ssa_def
*
168 nir_copysign(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
170 uint64_t masks
= 1ull << (x
->bit_size
- 1);
171 uint64_t maskv
= ~masks
;
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
);
176 return nir_ior(b
, nir_iand(b
, x
, v
), nir_iand(b
, y
, s
));
179 static inline nir_ssa_def
*
180 nir_degrees(nir_builder
*b
, nir_ssa_def
*val
)
182 return nir_fmul_imm(b
, val
, 180.0 / M_PI
);
185 static inline nir_ssa_def
*
186 nir_fdim(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
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
);
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
));
196 static inline nir_ssa_def
*
197 nir_distance(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
199 return nir_length(b
, nir_fsub(b
, x
, y
));
202 static inline nir_ssa_def
*
203 nir_fast_distance(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
205 return nir_fast_length(b
, nir_fsub(b
, x
, y
));
208 static inline nir_ssa_def
*
209 nir_fast_normalize(nir_builder
*b
, nir_ssa_def
*vec
)
211 return nir_fdiv(b
, vec
, nir_fast_length(b
, vec
));
214 static inline nir_ssa_def
*
215 nir_fmad(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
217 return nir_fadd(b
, nir_fmul(b
, x
, y
), z
);
220 static inline nir_ssa_def
*
221 nir_maxmag(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
223 nir_ssa_def
*xabs
= nir_fabs(b
, x
);
224 nir_ssa_def
*yabs
= nir_fabs(b
, y
);
226 nir_ssa_def
*condy
= nir_flt(b
, xabs
, yabs
);
227 nir_ssa_def
*condx
= nir_flt(b
, yabs
, xabs
);
229 return nir_bcsel(b
, condy
, y
, nir_bcsel(b
, condx
, x
, nir_fmax(b
, x
, y
)));
232 static inline nir_ssa_def
*
233 nir_minmag(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
235 nir_ssa_def
*xabs
= nir_fabs(b
, x
);
236 nir_ssa_def
*yabs
= nir_fabs(b
, y
);
238 nir_ssa_def
*condx
= nir_flt(b
, xabs
, yabs
);
239 nir_ssa_def
*condy
= nir_flt(b
, yabs
, xabs
);
241 return nir_bcsel(b
, condy
, y
, nir_bcsel(b
, condx
, x
, nir_fmin(b
, x
, y
)));
244 static inline nir_ssa_def
*
245 nir_nan(nir_builder
*b
, nir_ssa_def
*x
)
247 nir_ssa_def
*nan
= nir_imm_floatN_t(b
, NAN
, x
->bit_size
);
248 if (x
->num_components
== 1)
251 nir_ssa_def
*nans
[NIR_MAX_VEC_COMPONENTS
];
252 for (unsigned i
= 0; i
< x
->num_components
; ++i
)
255 return nir_vec(b
, nans
, x
->num_components
);
258 static inline nir_ssa_def
*
259 nir_radians(nir_builder
*b
, nir_ssa_def
*val
)
261 return nir_fmul_imm(b
, val
, M_PI
/ 180.0);
264 static inline nir_ssa_def
*
265 nir_select(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*s
)
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
));
271 return nir_bcsel(b
, nir_ieq(b
, s
, nir_imm_intN_t(b
, 0, s
->bit_size
)), x
, y
);
274 static inline nir_ssa_def
*
275 nir_clz_u(nir_builder
*b
, nir_ssa_def
*a
)
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
);
286 #endif /* NIR_BUILTIN_BUILDER_H */