gallivm: better support for fast rsqrt
[mesa.git] / src / gallium / auxiliary / gallivm / lp_bld_arit.h
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
89 /**
90 * Set when the weights for normalized are prescaled, that is, in range
91 * 0..2**n, as opposed to range 0..2**(n-1).
92 */
93 #define LP_BLD_LERP_PRESCALED_WEIGHTS (1 << 0)
94
95 /**
96 * Used internally when using wide intermediates for normalized lerps.
97 *
98 * Do not use.
99 */
100 #define LP_BLD_LERP_WIDE_NORMALIZED (1 << 1)
101
102 LLVMValueRef
103 lp_build_lerp(struct lp_build_context *bld,
104 LLVMValueRef x,
105 LLVMValueRef v0,
106 LLVMValueRef v1,
107 unsigned flags);
108
109 LLVMValueRef
110 lp_build_lerp_2d(struct lp_build_context *bld,
111 LLVMValueRef x,
112 LLVMValueRef y,
113 LLVMValueRef v00,
114 LLVMValueRef v01,
115 LLVMValueRef v10,
116 LLVMValueRef v11,
117 unsigned flags);
118
119 LLVMValueRef
120 lp_build_lerp_3d(struct lp_build_context *bld,
121 LLVMValueRef x,
122 LLVMValueRef y,
123 LLVMValueRef z,
124 LLVMValueRef v000,
125 LLVMValueRef v001,
126 LLVMValueRef v010,
127 LLVMValueRef v011,
128 LLVMValueRef v100,
129 LLVMValueRef v101,
130 LLVMValueRef v110,
131 LLVMValueRef v111,
132 unsigned flags);
133
134
135 LLVMValueRef
136 lp_build_min(struct lp_build_context *bld,
137 LLVMValueRef a,
138 LLVMValueRef b);
139
140 LLVMValueRef
141 lp_build_max(struct lp_build_context *bld,
142 LLVMValueRef a,
143 LLVMValueRef b);
144
145 LLVMValueRef
146 lp_build_clamp(struct lp_build_context *bld,
147 LLVMValueRef a,
148 LLVMValueRef min,
149 LLVMValueRef max);
150
151 LLVMValueRef
152 lp_build_abs(struct lp_build_context *bld,
153 LLVMValueRef a);
154
155 LLVMValueRef
156 lp_build_negate(struct lp_build_context *bld,
157 LLVMValueRef a);
158
159 LLVMValueRef
160 lp_build_sgn(struct lp_build_context *bld,
161 LLVMValueRef a);
162
163 LLVMValueRef
164 lp_build_set_sign(struct lp_build_context *bld,
165 LLVMValueRef a, LLVMValueRef sign);
166
167 LLVMValueRef
168 lp_build_int_to_float(struct lp_build_context *bld,
169 LLVMValueRef a);
170
171 LLVMValueRef
172 lp_build_round(struct lp_build_context *bld,
173 LLVMValueRef a);
174
175 LLVMValueRef
176 lp_build_floor(struct lp_build_context *bld,
177 LLVMValueRef a);
178
179 LLVMValueRef
180 lp_build_ceil(struct lp_build_context *bld,
181 LLVMValueRef a);
182
183 LLVMValueRef
184 lp_build_trunc(struct lp_build_context *bld,
185 LLVMValueRef a);
186
187 LLVMValueRef
188 lp_build_fract(struct lp_build_context *bld,
189 LLVMValueRef a);
190
191 LLVMValueRef
192 lp_build_fract_safe(struct lp_build_context *bld,
193 LLVMValueRef a);
194
195 LLVMValueRef
196 lp_build_ifloor(struct lp_build_context *bld,
197 LLVMValueRef a);
198 LLVMValueRef
199 lp_build_iceil(struct lp_build_context *bld,
200 LLVMValueRef a);
201
202 LLVMValueRef
203 lp_build_iround(struct lp_build_context *bld,
204 LLVMValueRef a);
205
206 LLVMValueRef
207 lp_build_itrunc(struct lp_build_context *bld,
208 LLVMValueRef a);
209
210 void
211 lp_build_ifloor_fract(struct lp_build_context *bld,
212 LLVMValueRef a,
213 LLVMValueRef *out_ipart,
214 LLVMValueRef *out_fpart);
215
216 void
217 lp_build_ifloor_fract_safe(struct lp_build_context *bld,
218 LLVMValueRef a,
219 LLVMValueRef *out_ipart,
220 LLVMValueRef *out_fpart);
221
222 LLVMValueRef
223 lp_build_sqrt(struct lp_build_context *bld,
224 LLVMValueRef a);
225
226 LLVMValueRef
227 lp_build_rcp(struct lp_build_context *bld,
228 LLVMValueRef a);
229
230 LLVMValueRef
231 lp_build_rsqrt(struct lp_build_context *bld,
232 LLVMValueRef a);
233
234 boolean
235 lp_build_fast_rsqrt_available(struct lp_type type);
236
237 LLVMValueRef
238 lp_build_fast_rsqrt(struct lp_build_context *bld,
239 LLVMValueRef a);
240
241 LLVMValueRef
242 lp_build_cos(struct lp_build_context *bld,
243 LLVMValueRef a);
244
245 LLVMValueRef
246 lp_build_sin(struct lp_build_context *bld,
247 LLVMValueRef a);
248
249 LLVMValueRef
250 lp_build_pow(struct lp_build_context *bld,
251 LLVMValueRef a,
252 LLVMValueRef b);
253
254 LLVMValueRef
255 lp_build_exp(struct lp_build_context *bld,
256 LLVMValueRef a);
257
258 LLVMValueRef
259 lp_build_log(struct lp_build_context *bld,
260 LLVMValueRef a);
261
262 LLVMValueRef
263 lp_build_exp2(struct lp_build_context *bld,
264 LLVMValueRef a);
265
266 LLVMValueRef
267 lp_build_extract_exponent(struct lp_build_context *bld,
268 LLVMValueRef x,
269 int bias);
270
271 LLVMValueRef
272 lp_build_extract_mantissa(struct lp_build_context *bld,
273 LLVMValueRef x);
274
275 LLVMValueRef
276 lp_build_log2(struct lp_build_context *bld,
277 LLVMValueRef a);
278
279 LLVMValueRef
280 lp_build_fast_log2(struct lp_build_context *bld,
281 LLVMValueRef a);
282
283 LLVMValueRef
284 lp_build_ilog2(struct lp_build_context *bld,
285 LLVMValueRef x);
286
287 void
288 lp_build_exp2_approx(struct lp_build_context *bld,
289 LLVMValueRef x,
290 LLVMValueRef *p_exp2_int_part,
291 LLVMValueRef *p_frac_part,
292 LLVMValueRef *p_exp2);
293
294 void
295 lp_build_log2_approx(struct lp_build_context *bld,
296 LLVMValueRef x,
297 LLVMValueRef *p_exp,
298 LLVMValueRef *p_floor_log2,
299 LLVMValueRef *p_log2);
300
301 LLVMValueRef
302 lp_build_mod(struct lp_build_context *bld,
303 LLVMValueRef x,
304 LLVMValueRef y);
305
306 #endif /* !LP_BLD_ARIT_H */