1/************************************************************************** 2 * 3 * Copyright 2009 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28/** 29 * @file 30 * Helper arithmetic functions. 31 * 32 * @author Jose Fonseca <jfonseca@vmware.com> 33 */ 34 35 36#ifndef LP_BLD_ARIT_H 37#define LP_BLD_ARIT_H 38 39 40#include "gallivm/lp_bld.h" 41 42 43struct lp_type; 44struct lp_build_context; 45 46 47/** 48 * Complement, i.e., 1 - a. 49 */ 50LLVMValueRef 51lp_build_comp(struct lp_build_context *bld, 52 LLVMValueRef a); 53 54LLVMValueRef 55lp_build_add(struct lp_build_context *bld, 56 LLVMValueRef a, 57 LLVMValueRef b); 58 59LLVMValueRef 60lp_build_horizontal_add(struct lp_build_context *bld, 61 LLVMValueRef a); 62 63LLVMValueRef 64lp_build_hadd_partial4(struct lp_build_context *bld, 65 LLVMValueRef vectors[], 66 unsigned num_vecs); 67 68LLVMValueRef 69lp_build_sub(struct lp_build_context *bld, 70 LLVMValueRef a, 71 LLVMValueRef b); 72 73LLVMValueRef 74lp_build_mul(struct lp_build_context *bld, 75 LLVMValueRef a, 76 LLVMValueRef b); 77 78LLVMValueRef 79lp_build_mul_imm(struct lp_build_context *bld, 80 LLVMValueRef a, 81 int b); 82 83LLVMValueRef 84lp_build_div(struct lp_build_context *bld, 85 LLVMValueRef a, 86 LLVMValueRef b); 87 88LLVMValueRef 89lp_build_lerp(struct lp_build_context *bld, 90 LLVMValueRef x, 91 LLVMValueRef v0, 92 LLVMValueRef v1); 93 94/** 95 * Bilinear interpolation. 96 * 97 * Values indices are in v_{yx}. 98 */ 99LLVMValueRef 100lp_build_lerp_2d(struct lp_build_context *bld, 101 LLVMValueRef x, 102 LLVMValueRef y, 103 LLVMValueRef v00, 104 LLVMValueRef v01, 105 LLVMValueRef v10, 106 LLVMValueRef v11); 107 108LLVMValueRef 109lp_build_min(struct lp_build_context *bld, 110 LLVMValueRef a, 111 LLVMValueRef b); 112 113LLVMValueRef 114lp_build_max(struct lp_build_context *bld, 115 LLVMValueRef a, 116 LLVMValueRef b); 117 118LLVMValueRef 119lp_build_clamp(struct lp_build_context *bld, 120 LLVMValueRef a, 121 LLVMValueRef min, 122 LLVMValueRef max); 123 124LLVMValueRef 125lp_build_abs(struct lp_build_context *bld, 126 LLVMValueRef a); 127 128LLVMValueRef 129lp_build_negate(struct lp_build_context *bld, 130 LLVMValueRef a); 131 132LLVMValueRef 133lp_build_sgn(struct lp_build_context *bld, 134 LLVMValueRef a); 135 136LLVMValueRef 137lp_build_set_sign(struct lp_build_context *bld, 138 LLVMValueRef a, LLVMValueRef sign); 139 140LLVMValueRef 141lp_build_int_to_float(struct lp_build_context *bld, 142 LLVMValueRef a); 143 144LLVMValueRef 145lp_build_round(struct lp_build_context *bld, 146 LLVMValueRef a); 147 148LLVMValueRef 149lp_build_floor(struct lp_build_context *bld, 150 LLVMValueRef a); 151 152LLVMValueRef 153lp_build_ceil(struct lp_build_context *bld, 154 LLVMValueRef a); 155 156LLVMValueRef 157lp_build_trunc(struct lp_build_context *bld, 158 LLVMValueRef a); 159 160LLVMValueRef 161lp_build_fract(struct lp_build_context *bld, 162 LLVMValueRef a); 163 164LLVMValueRef 165lp_build_fract_safe(struct lp_build_context *bld, 166 LLVMValueRef a); 167 168LLVMValueRef 169lp_build_ifloor(struct lp_build_context *bld, 170 LLVMValueRef a); 171LLVMValueRef 172lp_build_iceil(struct lp_build_context *bld, 173 LLVMValueRef a); 174 175LLVMValueRef 176lp_build_iround(struct lp_build_context *bld, 177 LLVMValueRef a); 178 179LLVMValueRef 180lp_build_itrunc(struct lp_build_context *bld, 181 LLVMValueRef a); 182 183void 184lp_build_ifloor_fract(struct lp_build_context *bld, 185 LLVMValueRef a, 186 LLVMValueRef *out_ipart, 187 LLVMValueRef *out_fpart); 188 189void 190lp_build_ifloor_fract_safe(struct lp_build_context *bld, 191 LLVMValueRef a, 192 LLVMValueRef *out_ipart, 193 LLVMValueRef *out_fpart); 194 195LLVMValueRef 196lp_build_sqrt(struct lp_build_context *bld, 197 LLVMValueRef a); 198 199LLVMValueRef 200lp_build_rcp(struct lp_build_context *bld, 201 LLVMValueRef a); 202 203LLVMValueRef 204lp_build_rsqrt(struct lp_build_context *bld, 205 LLVMValueRef a); 206 207LLVMValueRef 208lp_build_cos(struct lp_build_context *bld, 209 LLVMValueRef a); 210 211LLVMValueRef 212lp_build_sin(struct lp_build_context *bld, 213 LLVMValueRef a); 214 215LLVMValueRef 216lp_build_pow(struct lp_build_context *bld, 217 LLVMValueRef a, 218 LLVMValueRef b); 219 220LLVMValueRef 221lp_build_exp(struct lp_build_context *bld, 222 LLVMValueRef a); 223 224LLVMValueRef 225lp_build_log(struct lp_build_context *bld, 226 LLVMValueRef a); 227 228LLVMValueRef 229lp_build_exp2(struct lp_build_context *bld, 230 LLVMValueRef a); 231 232LLVMValueRef 233lp_build_extract_exponent(struct lp_build_context *bld, 234 LLVMValueRef x, 235 int bias); 236 237LLVMValueRef 238lp_build_extract_mantissa(struct lp_build_context *bld, 239 LLVMValueRef x); 240 241LLVMValueRef 242lp_build_log2(struct lp_build_context *bld, 243 LLVMValueRef a); 244 245LLVMValueRef 246lp_build_fast_log2(struct lp_build_context *bld, 247 LLVMValueRef a); 248 249LLVMValueRef 250lp_build_ilog2(struct lp_build_context *bld, 251 LLVMValueRef x); 252 253void 254lp_build_exp2_approx(struct lp_build_context *bld, 255 LLVMValueRef x, 256 LLVMValueRef *p_exp2_int_part, 257 LLVMValueRef *p_frac_part, 258 LLVMValueRef *p_exp2); 259 260void 261lp_build_log2_approx(struct lp_build_context *bld, 262 LLVMValueRef x, 263 LLVMValueRef *p_exp, 264 LLVMValueRef *p_floor_log2, 265 LLVMValueRef *p_log2); 266 267LLVMValueRef 268lp_build_mod(struct lp_build_context *bld, 269 LLVMValueRef x, 270 LLVMValueRef y); 271 272#endif /* !LP_BLD_ARIT_H */ 273