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 43 struct lp_type; 44 struct lp_build_context; 45 46 47 /** 48 * Complement, i.e., 1 - a. 49 */ 50 LLVMValueRef 51 lp_build_comp(struct lp_build_context *bld, 52 LLVMValueRef a); 53 54 LLVMValueRef 55 lp_build_add(struct lp_build_context *bld, 56 LLVMValueRef a, 57 LLVMValueRef b); 58 59 LLVMValueRef 60 lp_build_horizontal_add(struct lp_build_context *bld, 61 LLVMValueRef a); 62 63 LLVMValueRef 64 lp_build_hadd_partial4(struct lp_build_context *bld, 65 LLVMValueRef vectors[], 66 unsigned num_vecs); 67 68 LLVMValueRef 69 lp_build_sub(struct lp_build_context *bld, 70 LLVMValueRef a, 71 LLVMValueRef b); 72 73 LLVMValueRef 74 lp_build_mul(struct lp_build_context *bld, 75 LLVMValueRef a, 76 LLVMValueRef b); 77 78 LLVMValueRef 79 lp_build_mul_imm(struct lp_build_context *bld, 80 LLVMValueRef a, 81 int b); 82 83 LLVMValueRef 84 lp_build_div(struct lp_build_context *bld, 85 LLVMValueRef a, 86 LLVMValueRef b); 87 88 LLVMValueRef 89 lp_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 */ 99 LLVMValueRef 100 lp_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 108 LLVMValueRef 109 lp_build_min(struct lp_build_context *bld, 110 LLVMValueRef a, 111 LLVMValueRef b); 112 113 LLVMValueRef 114 lp_build_max(struct lp_build_context *bld, 115 LLVMValueRef a, 116 LLVMValueRef b); 117 118 LLVMValueRef 119 lp_build_clamp(struct lp_build_context *bld, 120 LLVMValueRef a, 121 LLVMValueRef min, 122 LLVMValueRef max); 123 124 LLVMValueRef 125 lp_build_abs(struct lp_build_context *bld, 126 LLVMValueRef a); 127 128 LLVMValueRef 129 lp_build_negate(struct lp_build_context *bld, 130 LLVMValueRef a); 131 132 LLVMValueRef 133 lp_build_sgn(struct lp_build_context *bld, 134 LLVMValueRef a); 135 136 LLVMValueRef 137 lp_build_set_sign(struct lp_build_context *bld, 138 LLVMValueRef a, LLVMValueRef sign); 139 140 LLVMValueRef 141 lp_build_int_to_float(struct lp_build_context *bld, 142 LLVMValueRef a); 143 144 LLVMValueRef 145 lp_build_round(struct lp_build_context *bld, 146 LLVMValueRef a); 147 148 LLVMValueRef 149 lp_build_floor(struct lp_build_context *bld, 150 LLVMValueRef a); 151 152 LLVMValueRef 153 lp_build_ceil(struct lp_build_context *bld, 154 LLVMValueRef a); 155 156 LLVMValueRef 157 lp_build_trunc(struct lp_build_context *bld, 158 LLVMValueRef a); 159 160 LLVMValueRef 161 lp_build_fract(struct lp_build_context *bld, 162 LLVMValueRef a); 163 164 LLVMValueRef 165 lp_build_fract_safe(struct lp_build_context *bld, 166 LLVMValueRef a); 167 168 LLVMValueRef 169 lp_build_ifloor(struct lp_build_context *bld, 170 LLVMValueRef a); 171 LLVMValueRef 172 lp_build_iceil(struct lp_build_context *bld, 173 LLVMValueRef a); 174 175 LLVMValueRef 176 lp_build_iround(struct lp_build_context *bld, 177 LLVMValueRef a); 178 179 LLVMValueRef 180 lp_build_itrunc(struct lp_build_context *bld, 181 LLVMValueRef a); 182 183 void 184 lp_build_ifloor_fract(struct lp_build_context *bld, 185 LLVMValueRef a, 186 LLVMValueRef *out_ipart, 187 LLVMValueRef *out_fpart); 188 189 void 190 lp_build_ifloor_fract_safe(struct lp_build_context *bld, 191 LLVMValueRef a, 192 LLVMValueRef *out_ipart, 193 LLVMValueRef *out_fpart); 194 195 LLVMValueRef 196 lp_build_sqrt(struct lp_build_context *bld, 197 LLVMValueRef a); 198 199 LLVMValueRef 200 lp_build_rcp(struct lp_build_context *bld, 201 LLVMValueRef a); 202 203 LLVMValueRef 204 lp_build_rsqrt(struct lp_build_context *bld, 205 LLVMValueRef a); 206 207 LLVMValueRef 208 lp_build_cos(struct lp_build_context *bld, 209 LLVMValueRef a); 210 211 LLVMValueRef 212 lp_build_sin(struct lp_build_context *bld, 213 LLVMValueRef a); 214 215 LLVMValueRef 216 lp_build_pow(struct lp_build_context *bld, 217 LLVMValueRef a, 218 LLVMValueRef b); 219 220 LLVMValueRef 221 lp_build_exp(struct lp_build_context *bld, 222 LLVMValueRef a); 223 224 LLVMValueRef 225 lp_build_log(struct lp_build_context *bld, 226 LLVMValueRef a); 227 228 LLVMValueRef 229 lp_build_exp2(struct lp_build_context *bld, 230 LLVMValueRef a); 231 232 LLVMValueRef 233 lp_build_extract_exponent(struct lp_build_context *bld, 234 LLVMValueRef x, 235 int bias); 236 237 LLVMValueRef 238 lp_build_extract_mantissa(struct lp_build_context *bld, 239 LLVMValueRef x); 240 241 LLVMValueRef 242 lp_build_log2(struct lp_build_context *bld, 243 LLVMValueRef a); 244 245 LLVMValueRef 246 lp_build_fast_log2(struct lp_build_context *bld, 247 LLVMValueRef a); 248 249 LLVMValueRef 250 lp_build_ilog2(struct lp_build_context *bld, 251 LLVMValueRef x); 252 253 void 254 lp_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 260 void 261 lp_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 267 LLVMValueRef 268 lp_build_mod(struct lp_build_context *bld, 269 LLVMValueRef x, 270 LLVMValueRef y); 271 272 #endif /* !LP_BLD_ARIT_H */ 273