Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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_polynomial(struct lp_build_context *bld,
  243.                     LLVMValueRef x,
  244.                     const double *coeffs,
  245.                     unsigned num_coeffs);
  246.  
  247. LLVMValueRef
  248. lp_build_cos(struct lp_build_context *bld,
  249.              LLVMValueRef a);
  250.  
  251. LLVMValueRef
  252. lp_build_sin(struct lp_build_context *bld,
  253.              LLVMValueRef a);
  254.  
  255. LLVMValueRef
  256. lp_build_pow(struct lp_build_context *bld,
  257.              LLVMValueRef a,
  258.              LLVMValueRef b);
  259.  
  260. LLVMValueRef
  261. lp_build_exp(struct lp_build_context *bld,
  262.              LLVMValueRef a);
  263.  
  264. LLVMValueRef
  265. lp_build_log(struct lp_build_context *bld,
  266.              LLVMValueRef a);
  267.  
  268. LLVMValueRef
  269. lp_build_exp2(struct lp_build_context *bld,
  270.               LLVMValueRef a);
  271.  
  272. LLVMValueRef
  273. lp_build_extract_exponent(struct lp_build_context *bld,
  274.                           LLVMValueRef x,
  275.                           int bias);
  276.  
  277. LLVMValueRef
  278. lp_build_extract_mantissa(struct lp_build_context *bld,
  279.                           LLVMValueRef x);
  280.  
  281. LLVMValueRef
  282. lp_build_log2(struct lp_build_context *bld,
  283.               LLVMValueRef a);
  284.  
  285. LLVMValueRef
  286. lp_build_fast_log2(struct lp_build_context *bld,
  287.                    LLVMValueRef a);
  288.  
  289. LLVMValueRef
  290. lp_build_ilog2(struct lp_build_context *bld,
  291.                LLVMValueRef x);
  292.  
  293. void
  294. lp_build_exp2_approx(struct lp_build_context *bld,
  295.                      LLVMValueRef x,
  296.                      LLVMValueRef *p_exp2_int_part,
  297.                      LLVMValueRef *p_frac_part,
  298.                      LLVMValueRef *p_exp2);
  299.  
  300. void
  301. lp_build_log2_approx(struct lp_build_context *bld,
  302.                      LLVMValueRef x,
  303.                      LLVMValueRef *p_exp,
  304.                      LLVMValueRef *p_floor_log2,
  305.                      LLVMValueRef *p_log2);
  306.  
  307. LLVMValueRef
  308. lp_build_mod(struct lp_build_context *bld,
  309.              LLVMValueRef x,
  310.              LLVMValueRef y);
  311.  
  312. #endif /* !LP_BLD_ARIT_H */
  313.