Path: blob/21.2-virgl/src/compiler/nir/nir_builtin_builder.h
4549 views
/*1* Copyright © 2018 Red Hat Inc.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#ifndef NIR_BUILTIN_BUILDER_H24#define NIR_BUILTIN_BUILDER_H2526#include "util/u_math.h"27#include "nir_builder.h"2829#ifdef __cplusplus30extern "C" {31#endif3233/*34* Functions are sorted alphabetically with removed type and "fast" prefix.35* Definitions for functions in the C file come first.36*/3738nir_ssa_def* nir_cross3(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);39nir_ssa_def* nir_cross4(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);40nir_ssa_def* nir_fast_length(nir_builder *b, nir_ssa_def *vec);41nir_ssa_def* nir_nextafter(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y);42nir_ssa_def* nir_normalize(nir_builder *b, nir_ssa_def *vec);43nir_ssa_def* nir_smoothstep(nir_builder *b, nir_ssa_def *edge0,44nir_ssa_def *edge1, nir_ssa_def *x);45nir_ssa_def* nir_upsample(nir_builder *b, nir_ssa_def *hi, nir_ssa_def *lo);46nir_ssa_def* nir_atan(nir_builder *b, nir_ssa_def *y_over_x);47nir_ssa_def* nir_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x);4849nir_ssa_def *50nir_get_texture_lod(nir_builder *b, nir_tex_instr *tex);5152nir_ssa_def *53nir_get_texture_size(nir_builder *b, nir_tex_instr *tex);5455static inline nir_ssa_def *56nir_nan_check2(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *res)57{58return nir_bcsel(b, nir_fneu(b, x, x), x, nir_bcsel(b, nir_fneu(b, y, y), y, res));59}6061static inline nir_ssa_def *62nir_fmax_abs_vec_comp(nir_builder *b, nir_ssa_def *vec)63{64nir_ssa_def *res = nir_channel(b, vec, 0);65for (unsigned i = 1; i < vec->num_components; ++i)66res = nir_fmax(b, res, nir_fabs(b, nir_channel(b, vec, i)));67return res;68}6970static inline nir_ssa_def *71nir_iabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)72{73nir_ssa_def *cond = nir_ige(b, x, y);74nir_ssa_def *res0 = nir_isub(b, x, y);75nir_ssa_def *res1 = nir_isub(b, y, x);76return nir_bcsel(b, cond, res0, res1);77}7879static inline nir_ssa_def *80nir_uabs_diff(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)81{82nir_ssa_def *cond = nir_uge(b, x, y);83nir_ssa_def *res0 = nir_isub(b, x, y);84nir_ssa_def *res1 = nir_isub(b, y, x);85return nir_bcsel(b, cond, res0, res1);86}8788static inline nir_ssa_def *89nir_fexp(nir_builder *b, nir_ssa_def *x)90{91return nir_fexp2(b, nir_fmul_imm(b, x, M_LOG2E));92}9394static inline nir_ssa_def *95nir_flog(nir_builder *b, nir_ssa_def *x)96{97return nir_fmul_imm(b, nir_flog2(b, x), 1.0 / M_LOG2E);98}99100static inline nir_ssa_def *101nir_imad24(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)102{103nir_ssa_def *temp = nir_imul24(b, x, y);104return nir_iadd(b, temp, z);105}106107static inline nir_ssa_def *108nir_imad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)109{110nir_ssa_def *temp = nir_imul_high(b, x, y);111return nir_iadd(b, temp, z);112}113114static inline nir_ssa_def *115nir_umad_hi(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)116{117nir_ssa_def *temp = nir_umul_high(b, x, y);118return nir_iadd(b, temp, z);119}120121static inline nir_ssa_def *122nir_bitselect(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s)123{124return nir_ior(b, nir_iand(b, nir_inot(b, s), x), nir_iand(b, s, y));125}126127static inline nir_ssa_def *128nir_copysign(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)129{130uint64_t masks = 1ull << (x->bit_size - 1);131uint64_t maskv = ~masks;132133nir_ssa_def *s = nir_imm_intN_t(b, masks, x->bit_size);134nir_ssa_def *v = nir_imm_intN_t(b, maskv, x->bit_size);135136return nir_ior(b, nir_iand(b, x, v), nir_iand(b, y, s));137}138139static inline nir_ssa_def *140nir_degrees(nir_builder *b, nir_ssa_def *val)141{142return nir_fmul_imm(b, val, 180.0 / M_PI);143}144145static inline nir_ssa_def *146nir_fdim(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)147{148nir_ssa_def *cond = nir_flt(b, y, x);149nir_ssa_def *res = nir_fsub(b, x, y);150nir_ssa_def *zero = nir_imm_floatN_t(b, 0.0, x->bit_size);151152// return NaN if either x or y are NaN, else x-y if x>y, else +0.0153return nir_nan_check2(b, x, y, nir_bcsel(b, cond, res, zero));154}155156static inline nir_ssa_def *157nir_fast_distance(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)158{159return nir_fast_length(b, nir_fsub(b, x, y));160}161162static inline nir_ssa_def*163nir_fast_normalize(nir_builder *b, nir_ssa_def *vec)164{165return nir_fdiv(b, vec, nir_fast_length(b, vec));166}167168static inline nir_ssa_def*169nir_fmad(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *z)170{171return nir_fadd(b, nir_fmul(b, x, y), z);172}173174static inline nir_ssa_def*175nir_maxmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)176{177nir_ssa_def *xabs = nir_fabs(b, x);178nir_ssa_def *yabs = nir_fabs(b, y);179180nir_ssa_def *condy = nir_flt(b, xabs, yabs);181nir_ssa_def *condx = nir_flt(b, yabs, xabs);182183return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmax(b, x, y)));184}185186static inline nir_ssa_def*187nir_minmag(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)188{189nir_ssa_def *xabs = nir_fabs(b, x);190nir_ssa_def *yabs = nir_fabs(b, y);191192nir_ssa_def *condx = nir_flt(b, xabs, yabs);193nir_ssa_def *condy = nir_flt(b, yabs, xabs);194195return nir_bcsel(b, condy, y, nir_bcsel(b, condx, x, nir_fmin(b, x, y)));196}197198static inline nir_ssa_def*199nir_nan(nir_builder *b, nir_ssa_def *x)200{201nir_ssa_def *nan = nir_imm_floatN_t(b, NAN, x->bit_size);202if (x->num_components == 1)203return nan;204205nir_ssa_def *nans[NIR_MAX_VEC_COMPONENTS];206for (unsigned i = 0; i < x->num_components; ++i)207nans[i] = nan;208209return nir_vec(b, nans, x->num_components);210}211212static inline nir_ssa_def *213nir_radians(nir_builder *b, nir_ssa_def *val)214{215return nir_fmul_imm(b, val, M_PI / 180.0);216}217218static inline nir_ssa_def *219nir_select(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *s)220{221if (s->num_components != 1) {222uint64_t mask = 1ull << (s->bit_size - 1);223s = nir_iand(b, s, nir_imm_intN_t(b, mask, s->bit_size));224}225return nir_bcsel(b, nir_ieq_imm(b, s, 0), x, y);226}227228static inline nir_ssa_def *229nir_ftan(nir_builder *b, nir_ssa_def *x)230{231return nir_fdiv(b, nir_fsin(b, x), nir_fcos(b, x));232}233234static inline nir_ssa_def *235nir_clz_u(nir_builder *b, nir_ssa_def *a)236{237nir_ssa_def *val;238val = nir_isub(b, nir_imm_intN_t(b, a->bit_size - 1, 32), nir_ufind_msb(b, a));239return nir_u2u(b, val, a->bit_size);240}241242static inline nir_ssa_def *243nir_ctz_u(nir_builder *b, nir_ssa_def *a)244{245nir_ssa_def *cond = nir_ieq(b, a, nir_imm_intN_t(b, 0, a->bit_size));246247return nir_bcsel(b, cond,248nir_imm_intN_t(b, a->bit_size, a->bit_size),249nir_u2u(b, nir_find_lsb(b, a), a->bit_size));250}251252#ifdef __cplusplus253}254#endif255256#endif /* NIR_BUILTIN_BUILDER_H */257258259