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_umul24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
94 nir_ssa_def
*mask
= nir_imm_int(b
, 0xffffff);
95 nir_ssa_def
*x_24
= nir_iand(b
, x
, mask
);
96 nir_ssa_def
*y_24
= nir_iand(b
, y
, mask
);
97 return nir_imul(b
, x_24
, y_24
);
100 static inline nir_ssa_def
*
101 nir_umad24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
103 nir_ssa_def
*temp
= nir_umul24(b
, x
, y
);
104 return nir_iadd(b
, temp
, z
);
107 static inline nir_ssa_def
*
108 nir_imad24(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
110 nir_ssa_def
*temp
= nir_imul24(b
, x
, y
);
111 return nir_iadd(b
, temp
, z
);
114 static inline nir_ssa_def
*
115 nir_imad_hi(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
117 nir_ssa_def
*temp
= nir_imul_high(b
, x
, y
);
118 return nir_iadd(b
, temp
, z
);
121 static inline nir_ssa_def
*
122 nir_umad_hi(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
124 nir_ssa_def
*temp
= nir_umul_high(b
, x
, y
);
125 return nir_iadd(b
, temp
, z
);
128 static inline nir_ssa_def
*
129 nir_bitselect(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*s
)
131 return nir_ior(b
, nir_iand(b
, nir_inot(b
, s
), x
), nir_iand(b
, s
, y
));
134 static inline nir_ssa_def
*
135 nir_fclamp(nir_builder
*b
,
136 nir_ssa_def
*x
, nir_ssa_def
*min_val
, nir_ssa_def
*max_val
)
138 return nir_fmin(b
, nir_fmax(b
, x
, min_val
), max_val
);
141 static inline nir_ssa_def
*
142 nir_iclamp(nir_builder
*b
,
143 nir_ssa_def
*x
, nir_ssa_def
*min_val
, nir_ssa_def
*max_val
)
145 return nir_imin(b
, nir_imax(b
, x
, min_val
), max_val
);
148 static inline nir_ssa_def
*
149 nir_uclamp(nir_builder
*b
,
150 nir_ssa_def
*x
, nir_ssa_def
*min_val
, nir_ssa_def
*max_val
)
152 return nir_umin(b
, nir_umax(b
, x
, min_val
), max_val
);
155 static inline nir_ssa_def
*
156 nir_copysign(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
158 uint64_t masks
= 1ull << (x
->bit_size
- 1);
159 uint64_t maskv
= ~masks
;
161 nir_ssa_def
*s
= nir_imm_intN_t(b
, masks
, x
->bit_size
);
162 nir_ssa_def
*v
= nir_imm_intN_t(b
, maskv
, x
->bit_size
);
164 return nir_ior(b
, nir_iand(b
, x
, v
), nir_iand(b
, y
, s
));
167 static inline nir_ssa_def
*
168 nir_degrees(nir_builder
*b
, nir_ssa_def
*val
)
170 return nir_fmul_imm(b
, val
, 180.0 / M_PI
);
173 static inline nir_ssa_def
*
174 nir_fdim(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
176 nir_ssa_def
*cond
= nir_flt(b
, y
, x
);
177 nir_ssa_def
*res
= nir_fsub(b
, x
, y
);
178 nir_ssa_def
*zero
= nir_imm_floatN_t(b
, 0.0, x
->bit_size
);
180 // return NaN if either x or y are NaN, else x-y if x>y, else +0.0
181 return nir_nan_check2(b
, x
, y
, nir_bcsel(b
, cond
, res
, zero
));
184 static inline nir_ssa_def
*
185 nir_distance(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
187 return nir_length(b
, nir_fsub(b
, x
, y
));
190 static inline nir_ssa_def
*
191 nir_fast_distance(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
193 return nir_fast_length(b
, nir_fsub(b
, x
, y
));
196 static inline nir_ssa_def
*
197 nir_fast_normalize(nir_builder
*b
, nir_ssa_def
*vec
)
199 return nir_fdiv(b
, vec
, nir_fast_length(b
, vec
));
202 static inline nir_ssa_def
*
203 nir_fmad(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*z
)
205 return nir_fadd(b
, nir_fmul(b
, x
, y
), z
);
208 static inline nir_ssa_def
*
209 nir_maxmag(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
)
211 nir_ssa_def
*xabs
= nir_fabs(b
, x
);
212 nir_ssa_def
*yabs
= nir_fabs(b
, y
);
214 nir_ssa_def
*condy
= nir_flt(b
, xabs
, yabs
);
215 nir_ssa_def
*condx
= nir_flt(b
, yabs
, xabs
);
217 return nir_bcsel(b
, condy
, y
, nir_bcsel(b
, condx
, x
, nir_fmax(b
, x
, y
)));
220 static inline nir_ssa_def
*
221 nir_minmag(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
*condx
= nir_flt(b
, xabs
, yabs
);
227 nir_ssa_def
*condy
= nir_flt(b
, yabs
, xabs
);
229 return nir_bcsel(b
, condy
, y
, nir_bcsel(b
, condx
, x
, nir_fmin(b
, x
, y
)));
232 static inline nir_ssa_def
*
233 nir_nan(nir_builder
*b
, nir_ssa_def
*x
)
235 nir_ssa_def
*nan
= nir_imm_floatN_t(b
, NAN
, x
->bit_size
);
236 if (x
->num_components
== 1)
239 nir_ssa_def
*nans
[NIR_MAX_VEC_COMPONENTS
];
240 for (unsigned i
= 0; i
< x
->num_components
; ++i
)
243 return nir_vec(b
, nans
, x
->num_components
);
246 static inline nir_ssa_def
*
247 nir_radians(nir_builder
*b
, nir_ssa_def
*val
)
249 return nir_fmul_imm(b
, val
, M_PI
/ 180.0);
252 static inline nir_ssa_def
*
253 nir_select(nir_builder
*b
, nir_ssa_def
*x
, nir_ssa_def
*y
, nir_ssa_def
*s
)
255 if (s
->num_components
!= 1) {
256 uint64_t mask
= 1ull << (s
->bit_size
- 1);
257 s
= nir_iand(b
, s
, nir_imm_intN_t(b
, mask
, s
->bit_size
));
259 return nir_bcsel(b
, nir_ieq(b
, s
, nir_imm_intN_t(b
, 0, s
->bit_size
)), x
, y
);
262 static inline nir_ssa_def
*
263 nir_clz_u(nir_builder
*b
, nir_ssa_def
*a
)
266 val
= nir_isub(b
, nir_imm_intN_t(b
, a
->bit_size
- 1, 32), nir_ufind_msb(b
, a
));
267 return nir_u2u(b
, val
, a
->bit_size
);
274 #endif /* NIR_BUILTIN_BUILDER_H */