622 lines · plain
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include <clc/clc_convert.h>10#include <clc/float/definitions.h>11#include <clc/internal/clc.h>12#include <clc/math/clc_fabs.h>13#include <clc/math/clc_fma.h>14#include <clc/math/clc_log.h>15#include <clc/math/clc_mad.h>16#include <clc/math/clc_sinpi.h>17#include <clc/math/math.h>18 19// ====================================================20// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.21//22// Developed at SunPro, a Sun Microsystems, Inc. business.23// Permission to use, copy, modify, and distribute this24// software is freely granted, provided that this notice25// is preserved.26// ====================================================27 28#define pi_f 3.1415927410e+00f /* 0x40490fdb */29 30#define a0_f 7.7215664089e-02f /* 0x3d9e233f */31#define a1_f 3.2246702909e-01f /* 0x3ea51a66 */32#define a2_f 6.7352302372e-02f /* 0x3d89f001 */33#define a3_f 2.0580807701e-02f /* 0x3ca89915 */34#define a4_f 7.3855509982e-03f /* 0x3bf2027e */35#define a5_f 2.8905137442e-03f /* 0x3b3d6ec6 */36#define a6_f 1.1927076848e-03f /* 0x3a9c54a1 */37#define a7_f 5.1006977446e-04f /* 0x3a05b634 */38#define a8_f 2.2086278477e-04f /* 0x39679767 */39#define a9_f 1.0801156895e-04f /* 0x38e28445 */40#define a10_f 2.5214456400e-05f /* 0x37d383a2 */41#define a11_f 4.4864096708e-05f /* 0x383c2c75 */42 43#define tc_f 1.4616321325e+00f /* 0x3fbb16c3 */44 45#define tf_f -1.2148628384e-01f /* 0xbdf8cdcd */46/* tt -(tail of tf) */47#define tt_f 6.6971006518e-09f /* 0x31e61c52 */48 49#define t0_f 4.8383611441e-01f /* 0x3ef7b95e */50#define t1_f -1.4758771658e-01f /* 0xbe17213c */51#define t2_f 6.4624942839e-02f /* 0x3d845a15 */52#define t3_f -3.2788541168e-02f /* 0xbd064d47 */53#define t4_f 1.7970675603e-02f /* 0x3c93373d */54#define t5_f -1.0314224288e-02f /* 0xbc28fcfe */55#define t6_f 6.1005386524e-03f /* 0x3bc7e707 */56#define t7_f -3.6845202558e-03f /* 0xbb7177fe */57#define t8_f 2.2596477065e-03f /* 0x3b141699 */58#define t9_f -1.4034647029e-03f /* 0xbab7f476 */59#define t10_f 8.8108185446e-04f /* 0x3a66f867 */60#define t11_f -5.3859531181e-04f /* 0xba0d3085 */61#define t12_f 3.1563205994e-04f /* 0x39a57b6b */62#define t13_f -3.1275415677e-04f /* 0xb9a3f927 */63#define t14_f 3.3552918467e-04f /* 0x39afe9f7 */64 65#define u0_f -7.7215664089e-02f /* 0xbd9e233f */66#define u1_f 6.3282704353e-01f /* 0x3f2200f4 */67#define u2_f 1.4549225569e+00f /* 0x3fba3ae7 */68#define u3_f 9.7771751881e-01f /* 0x3f7a4bb2 */69#define u4_f 2.2896373272e-01f /* 0x3e6a7578 */70#define u5_f 1.3381091878e-02f /* 0x3c5b3c5e */71 72#define v1_f 2.4559779167e+00f /* 0x401d2ebe */73#define v2_f 2.1284897327e+00f /* 0x4008392d */74#define v3_f 7.6928514242e-01f /* 0x3f44efdf */75#define v4_f 1.0422264785e-01f /* 0x3dd572af */76#define v5_f 3.2170924824e-03f /* 0x3b52d5db */77 78#define s0_f -7.7215664089e-02f /* 0xbd9e233f */79#define s1_f 2.1498242021e-01f /* 0x3e5c245a */80#define s2_f 3.2577878237e-01f /* 0x3ea6cc7a */81#define s3_f 1.4635047317e-01f /* 0x3e15dce6 */82#define s4_f 2.6642270386e-02f /* 0x3cda40e4 */83#define s5_f 1.8402845599e-03f /* 0x3af135b4 */84#define s6_f 3.1947532989e-05f /* 0x3805ff67 */85 86#define r1_f 1.3920053244e+00f /* 0x3fb22d3b */87#define r2_f 7.2193557024e-01f /* 0x3f38d0c5 */88#define r3_f 1.7193385959e-01f /* 0x3e300f6e */89#define r4_f 1.8645919859e-02f /* 0x3c98bf54 */90#define r5_f 7.7794247773e-04f /* 0x3a4beed6 */91#define r6_f 7.3266842264e-06f /* 0x36f5d7bd */92 93#define w0_f 4.1893854737e-01f /* 0x3ed67f1d */94#define w1_f 8.3333335817e-02f /* 0x3daaaaab */95#define w2_f -2.7777778450e-03f /* 0xbb360b61 */96#define w3_f 7.9365057172e-04f /* 0x3a500cfd */97#define w4_f -5.9518753551e-04f /* 0xba1c065c */98#define w5_f 8.3633989561e-04f /* 0x3a5b3dd2 */99#define w6_f -1.6309292987e-03f /* 0xbad5c4e8 */100 101_CLC_OVERLOAD _CLC_DEF float __clc_lgamma_r(float x, private int *signp) {102 int hx = __clc_as_int(x);103 float absx = __clc_fabs(x);104 int ix = __clc_as_int(absx);105 106 if (ix >= 0x7f800000) {107 *signp = 1;108 return x;109 }110 111 if (absx < 0x1.0p-70f) {112 *signp = hx < 0 ? -1 : 1;113 return -__clc_log(absx);114 }115 116 float r;117 118 if (absx == 1.0f | absx == 2.0f)119 r = 0.0f;120 121 else if (absx < 2.0f) {122 float y = 2.0f - absx;123 int i = 0;124 125 int c = absx < 0x1.bb4c30p+0f;126 float yt = absx - tc_f;127 y = c ? yt : y;128 i = c ? 1 : i;129 130 c = absx < 0x1.3b4c40p+0f;131 yt = absx - 1.0f;132 y = c ? yt : y;133 i = c ? 2 : i;134 135 r = -__clc_log(absx);136 yt = 1.0f - absx;137 c = absx <= 0x1.ccccccp-1f;138 r = c ? r : 0.0f;139 y = c ? yt : y;140 i = c ? 0 : i;141 142 c = absx < 0x1.769440p-1f;143 yt = absx - (tc_f - 1.0f);144 y = c ? yt : y;145 i = c ? 1 : i;146 147 c = absx < 0x1.da6610p-3f;148 y = c ? absx : y;149 i = c ? 2 : i;150 151 float z, w, p1, p2, p3, p;152 switch (i) {153 case 0:154 z = y * y;155 p1 = __clc_mad(156 z,157 __clc_mad(158 z,159 __clc_mad(z, __clc_mad(z, __clc_mad(z, a10_f, a8_f), a6_f), a4_f),160 a2_f),161 a0_f);162 p2 = z *163 __clc_mad(164 z,165 __clc_mad(166 z,167 __clc_mad(z, __clc_mad(z, __clc_mad(z, a11_f, a9_f), a7_f),168 a5_f),169 a3_f),170 a1_f);171 p = __clc_mad(y, p1, p2);172 r += __clc_mad(y, -0.5f, p);173 break;174 case 1:175 z = y * y;176 w = z * y;177 p1 = __clc_mad(178 w, __clc_mad(w, __clc_mad(w, __clc_mad(w, t12_f, t9_f), t6_f), t3_f),179 t0_f);180 p2 = __clc_mad(181 w, __clc_mad(w, __clc_mad(w, __clc_mad(w, t13_f, t10_f), t7_f), t4_f),182 t1_f);183 p3 = __clc_mad(184 w, __clc_mad(w, __clc_mad(w, __clc_mad(w, t14_f, t11_f), t8_f), t5_f),185 t2_f);186 p = __clc_mad(z, p1, -__clc_mad(w, -__clc_mad(y, p3, p2), tt_f));187 r += tf_f + p;188 break;189 case 2:190 p1 = y *191 __clc_mad(192 y,193 __clc_mad(y,194 __clc_mad(y,195 __clc_mad(y, __clc_mad(y, u5_f, u4_f), u3_f),196 u2_f),197 u1_f),198 u0_f);199 p2 = __clc_mad(200 y,201 __clc_mad(202 y,203 __clc_mad(y, __clc_mad(y, __clc_mad(y, v5_f, v4_f), v3_f), v2_f),204 v1_f),205 1.0f);206 r += __clc_mad(y, -0.5f, MATH_DIVIDE(p1, p2));207 break;208 }209 } else if (absx < 8.0f) {210 int i = (int)absx;211 float y = absx - (float)i;212 float p =213 y *214 __clc_mad(215 y,216 __clc_mad(217 y,218 __clc_mad(219 y,220 __clc_mad(y, __clc_mad(y, __clc_mad(y, s6_f, s5_f), s4_f),221 s3_f),222 s2_f),223 s1_f),224 s0_f);225 float q = __clc_mad(226 y,227 __clc_mad(228 y,229 __clc_mad(y,230 __clc_mad(y, __clc_mad(y, __clc_mad(y, r6_f, r5_f), r4_f),231 r3_f),232 r2_f),233 r1_f),234 1.0f);235 r = __clc_mad(y, 0.5f, MATH_DIVIDE(p, q));236 237 float y6 = y + 6.0f;238 float y5 = y + 5.0f;239 float y4 = y + 4.0f;240 float y3 = y + 3.0f;241 float y2 = y + 2.0f;242 243 float z = 1.0f;244 z *= i > 6 ? y6 : 1.0f;245 z *= i > 5 ? y5 : 1.0f;246 z *= i > 4 ? y4 : 1.0f;247 z *= i > 3 ? y3 : 1.0f;248 z *= i > 2 ? y2 : 1.0f;249 250 r += __clc_log(z);251 } else if (absx < 0x1.0p+58f) {252 float z = 1.0f / absx;253 float y = z * z;254 float w = __clc_mad(255 z,256 __clc_mad(257 y,258 __clc_mad(y,259 __clc_mad(y, __clc_mad(y, __clc_mad(y, w6_f, w5_f), w4_f),260 w3_f),261 w2_f),262 w1_f),263 w0_f);264 r = __clc_mad(absx - 0.5f, __clc_log(absx) - 1.0f, w);265 } else266 // 2**58 <= x <= Inf267 r = absx * (__clc_log(absx) - 1.0f);268 269 int s = 1;270 271 if (x < 0.0f) {272 float t = __clc_sinpi(x);273 r = __clc_log(pi_f / __clc_fabs(t * x)) - r;274 r = t == 0.0f ? INFINITY : r;275 s = t < 0.0f ? -1 : s;276 }277 278 *signp = s;279 return r;280}281 282#ifdef cl_khr_fp64283#pragma OPENCL EXTENSION cl_khr_fp64 : enable284// ====================================================285// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.286//287// Developed at SunPro, a Sun Microsystems, Inc. business.288// Permission to use, copy, modify, and distribute this289// software is freely granted, provided that this notice290// is preserved.291// ====================================================292 293// lgamma_r(x, i)294// Reentrant version of the logarithm of the Gamma function295// with user provide pointer for the sign of Gamma(x).296//297// Method:298// 1. Argument Reduction for 0 < x <= 8299// Since gamma(1+s)=s*gamma(s), for x in [0,8], we may300// reduce x to a number in [1.5,2.5] by301// lgamma(1+s) = log(s) + lgamma(s)302// for example,303// lgamma(7.3) = log(6.3) + lgamma(6.3)304// = log(6.3*5.3) + lgamma(5.3)305// = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)306// 2. Polynomial approximation of lgamma around its307// minimun ymin=1.461632144968362245 to maintain monotonicity.308// On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use309// Let z = x-ymin;310// lgamma(x) = -1.214862905358496078218 + z^2*poly(z)311// where312// poly(z) is a 14 degree polynomial.313// 2. Rational approximation in the primary interval [2,3]314// We use the following approximation:315// s = x-2.0;316// lgamma(x) = 0.5*s + s*P(s)/Q(s)317// with accuracy318// |P/Q - (lgamma(x)-0.5s)| < 2**-61.71319// Our algorithms are based on the following observation320//321// zeta(2)-1 2 zeta(3)-1 3322// lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...323// 2 3324//325// where Euler = 0.5771... is the Euler constant, which is very326// close to 0.5.327//328// 3. For x>=8, we have329// lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....330// (better formula:331// lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)332// Let z = 1/x, then we approximation333// f(z) = lgamma(x) - (x-0.5)(log(x)-1)334// by335// 3 5 11336// w = w0 + w1*z + w2*z + w3*z + ... + w6*z337// where338// |w - f(z)| < 2**-58.74339//340// 4. For negative x, since (G is gamma function)341// -x*G(-x)*G(x) = pi/sin(pi*x),342// we have343// G(x) = pi/(sin(pi*x)*(-x)*G(-x))344// since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0345// Hence, for x<0, signgam = sign(sin(pi*x)) and346// lgamma(x) = log(|Gamma(x)|)347// = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);348// Note: one should avoid compute pi*(-x) directly in the349// computation of sin(pi*(-x)).350//351// 5. Special Cases352// lgamma(2+s) ~ s*(1-Euler) for tiny s353// lgamma(1)=lgamma(2)=0354// lgamma(x) ~ -log(x) for tiny x355// lgamma(0) = lgamma(inf) = inf356// lgamma(-integer) = +-inf357//358#define pi 3.14159265358979311600e+00 /* 0x400921FB, 0x54442D18 */359 360#define a0 7.72156649015328655494e-02 /* 0x3FB3C467, 0xE37DB0C8 */361#define a1 3.22467033424113591611e-01 /* 0x3FD4A34C, 0xC4A60FAD */362#define a2 6.73523010531292681824e-02 /* 0x3FB13E00, 0x1A5562A7 */363#define a3 2.05808084325167332806e-02 /* 0x3F951322, 0xAC92547B */364#define a4 7.38555086081402883957e-03 /* 0x3F7E404F, 0xB68FEFE8 */365#define a5 2.89051383673415629091e-03 /* 0x3F67ADD8, 0xCCB7926B */366#define a6 1.19270763183362067845e-03 /* 0x3F538A94, 0x116F3F5D */367#define a7 5.10069792153511336608e-04 /* 0x3F40B6C6, 0x89B99C00 */368#define a8 2.20862790713908385557e-04 /* 0x3F2CF2EC, 0xED10E54D */369#define a9 1.08011567247583939954e-04 /* 0x3F1C5088, 0x987DFB07 */370#define a10 2.52144565451257326939e-05 /* 0x3EFA7074, 0x428CFA52 */371#define a11 4.48640949618915160150e-05 /* 0x3F07858E, 0x90A45837 */372 373#define tc 1.46163214496836224576e+00 /* 0x3FF762D8, 0x6356BE3F */374#define tf -1.21486290535849611461e-01 /* 0xBFBF19B9, 0xBCC38A42 */375#define tt -3.63867699703950536541e-18 /* 0xBC50C7CA, 0xA48A971F */376 377#define t0 4.83836122723810047042e-01 /* 0x3FDEF72B, 0xC8EE38A2 */378#define t1 -1.47587722994593911752e-01 /* 0xBFC2E427, 0x8DC6C509 */379#define t2 6.46249402391333854778e-02 /* 0x3FB08B42, 0x94D5419B */380#define t3 -3.27885410759859649565e-02 /* 0xBFA0C9A8, 0xDF35B713 */381#define t4 1.79706750811820387126e-02 /* 0x3F9266E7, 0x970AF9EC */382#define t5 -1.03142241298341437450e-02 /* 0xBF851F9F, 0xBA91EC6A */383#define t6 6.10053870246291332635e-03 /* 0x3F78FCE0, 0xE370E344 */384#define t7 -3.68452016781138256760e-03 /* 0xBF6E2EFF, 0xB3E914D7 */385#define t8 2.25964780900612472250e-03 /* 0x3F6282D3, 0x2E15C915 */386#define t9 -1.40346469989232843813e-03 /* 0xBF56FE8E, 0xBF2D1AF1 */387#define t10 8.81081882437654011382e-04 /* 0x3F4CDF0C, 0xEF61A8E9 */388#define t11 -5.38595305356740546715e-04 /* 0xBF41A610, 0x9C73E0EC */389#define t12 3.15632070903625950361e-04 /* 0x3F34AF6D, 0x6C0EBBF7 */390#define t13 -3.12754168375120860518e-04 /* 0xBF347F24, 0xECC38C38 */391#define t14 3.35529192635519073543e-04 /* 0x3F35FD3E, 0xE8C2D3F4 */392 393#define u0 -7.72156649015328655494e-02 /* 0xBFB3C467, 0xE37DB0C8 */394#define u1 6.32827064025093366517e-01 /* 0x3FE4401E, 0x8B005DFF */395#define u2 1.45492250137234768737e+00 /* 0x3FF7475C, 0xD119BD6F */396#define u3 9.77717527963372745603e-01 /* 0x3FEF4976, 0x44EA8450 */397#define u4 2.28963728064692451092e-01 /* 0x3FCD4EAE, 0xF6010924 */398#define u5 1.33810918536787660377e-02 /* 0x3F8B678B, 0xBF2BAB09 */399 400#define v1 2.45597793713041134822e+00 /* 0x4003A5D7, 0xC2BD619C */401#define v2 2.12848976379893395361e+00 /* 0x40010725, 0xA42B18F5 */402#define v3 7.69285150456672783825e-01 /* 0x3FE89DFB, 0xE45050AF */403#define v4 1.04222645593369134254e-01 /* 0x3FBAAE55, 0xD6537C88 */404#define v5 3.21709242282423911810e-03 /* 0x3F6A5ABB, 0x57D0CF61 */405 406#define s0_d -7.72156649015328655494e-02 /* 0xBFB3C467, 0xE37DB0C8 */407#define s1_d 2.14982415960608852501e-01 /* 0x3FCB848B, 0x36E20878 */408#define s2_d 3.25778796408930981787e-01 /* 0x3FD4D98F, 0x4F139F59 */409#define s3_d 1.46350472652464452805e-01 /* 0x3FC2BB9C, 0xBEE5F2F7 */410#define s4_d 2.66422703033638609560e-02 /* 0x3F9B481C, 0x7E939961 */411#define s5_d 1.84028451407337715652e-03 /* 0x3F5E26B6, 0x7368F239 */412#define s6_d 3.19475326584100867617e-05 /* 0x3F00BFEC, 0xDD17E945 */413 414#define r1 1.39200533467621045958e+00 /* 0x3FF645A7, 0x62C4AB74 */415#define r2 7.21935547567138069525e-01 /* 0x3FE71A18, 0x93D3DCDC */416#define r3 1.71933865632803078993e-01 /* 0x3FC601ED, 0xCCFBDF27 */417#define r4 1.86459191715652901344e-02 /* 0x3F9317EA, 0x742ED475 */418#define r5 7.77942496381893596434e-04 /* 0x3F497DDA, 0xCA41A95B */419#define r6 7.32668430744625636189e-06 /* 0x3EDEBAF7, 0xA5B38140 */420 421#define w0 4.18938533204672725052e-01 /* 0x3FDACFE3, 0x90C97D69 */422#define w1 8.33333333333329678849e-02 /* 0x3FB55555, 0x5555553B */423#define w2 -2.77777777728775536470e-03 /* 0xBF66C16C, 0x16B02E5C */424#define w3 7.93650558643019558500e-04 /* 0x3F4A019F, 0x98CF38B6 */425#define w4 -5.95187557450339963135e-04 /* 0xBF4380CB, 0x8C0FE741 */426#define w5 8.36339918996282139126e-04 /* 0x3F4B67BA, 0x4CDAD5D1 */427#define w6 -1.63092934096575273989e-03 /* 0xBF5AB89D, 0x0B9E43E4 */428 429_CLC_OVERLOAD _CLC_DEF double __clc_lgamma_r(double x, private int *ip) {430 ulong ux = __clc_as_ulong(x);431 double absx = __clc_fabs(x);432 ulong ax = __clc_as_ulong(absx);433 434 if (ax >= 0x7ff0000000000000UL) {435 // +-Inf, NaN436 *ip = 1;437 return absx;438 }439 440 if (absx < 0x1.0p-70) {441 *ip = ax == ux ? 1 : -1;442 return -__clc_log(absx);443 }444 445 // Handle rest of range446 double r;447 448 if (absx < 2.0) {449 int i = 0;450 double y = 2.0 - absx;451 452 int c = absx < 0x1.bb4c3p+0;453 double t = absx - tc;454 i = c ? 1 : i;455 y = c ? t : y;456 457 c = absx < 0x1.3b4c4p+0;458 t = absx - 1.0;459 i = c ? 2 : i;460 y = c ? t : y;461 462 c = absx <= 0x1.cccccp-1;463 t = -__clc_log(absx);464 r = c ? t : 0.0;465 t = 1.0 - absx;466 i = c ? 0 : i;467 y = c ? t : y;468 469 c = absx < 0x1.76944p-1;470 t = absx - (tc - 1.0);471 i = c ? 1 : i;472 y = c ? t : y;473 474 c = absx < 0x1.da661p-3;475 i = c ? 2 : i;476 y = c ? absx : y;477 478 double p, q;479 480 switch (i) {481 case 0:482 p = __clc_fma(483 y, __clc_fma(y, __clc_fma(y, __clc_fma(y, a11, a10), a9), a8), a7);484 p = __clc_fma(y, __clc_fma(y, __clc_fma(y, __clc_fma(y, p, a6), a5), a4),485 a3);486 p = __clc_fma(y, __clc_fma(y, __clc_fma(y, p, a2), a1), a0);487 r = __clc_fma(y, p - 0.5, r);488 break;489 case 1:490 p = __clc_fma(491 y, __clc_fma(y, __clc_fma(y, __clc_fma(y, t14, t13), t12), t11), t10);492 p = __clc_fma(493 y,494 __clc_fma(y, __clc_fma(y, __clc_fma(y, __clc_fma(y, p, t9), t8), t7),495 t6),496 t5);497 p = __clc_fma(498 y,499 __clc_fma(y, __clc_fma(y, __clc_fma(y, __clc_fma(y, p, t4), t3), t2),500 t1),501 t0);502 p = __clc_fma(y * y, p, -tt);503 r += (tf + p);504 break;505 case 2:506 p = y *507 __clc_fma(508 y,509 __clc_fma(510 y, __clc_fma(y, __clc_fma(y, __clc_fma(y, u5, u4), u3), u2),511 u1),512 u0);513 q = __clc_fma(514 y,515 __clc_fma(y, __clc_fma(y, __clc_fma(y, __clc_fma(y, v5, v4), v3), v2),516 v1),517 1.0);518 r += __clc_fma(-0.5, y, p / q);519 }520 } else if (absx < 8.0) {521 int i = absx;522 double y = absx - (double)i;523 double p =524 y *525 __clc_fma(526 y,527 __clc_fma(528 y,529 __clc_fma(530 y,531 __clc_fma(y, __clc_fma(y, __clc_fma(y, s6_d, s5_d), s4_d),532 s3_d),533 s2_d),534 s1_d),535 s0_d);536 double q = __clc_fma(537 y,538 __clc_fma(539 y,540 __clc_fma(y,541 __clc_fma(y, __clc_fma(y, __clc_fma(y, r6, r5), r4), r3),542 r2),543 r1),544 1.0);545 r = __clc_fma(0.5, y, p / q);546 double z = 1.0;547 // lgamma(1+s) = log(s) + lgamma(s)548 double y6 = y + 6.0;549 double y5 = y + 5.0;550 double y4 = y + 4.0;551 double y3 = y + 3.0;552 double y2 = y + 2.0;553 z *= i > 6 ? y6 : 1.0;554 z *= i > 5 ? y5 : 1.0;555 z *= i > 4 ? y4 : 1.0;556 z *= i > 3 ? y3 : 1.0;557 z *= i > 2 ? y2 : 1.0;558 r += __clc_log(z);559 } else {560 double z = 1.0 / absx;561 double z2 = z * z;562 double w = __clc_fma(563 z,564 __clc_fma(565 z2,566 __clc_fma(567 z2, __clc_fma(z2, __clc_fma(z2, __clc_fma(z2, w6, w5), w4), w3),568 w2),569 w1),570 w0);571 r = (absx - 0.5) * (__clc_log(absx) - 1.0) + w;572 }573 574 if (x < 0.0) {575 double t = __clc_sinpi(x);576 r = __clc_log(pi / __clc_fabs(t * x)) - r;577 r = t == 0.0 ? INFINITY : r;578 *ip = t < 0.0 ? -1 : 1;579 } else580 *ip = 1;581 582 return r;583}584 585#endif586 587#ifdef cl_khr_fp16588 589#pragma OPENCL EXTENSION cl_khr_fp16 : enable590 591_CLC_OVERLOAD _CLC_DEF half __clc_lgamma_r(half x, private int *iptr) {592 return (half)__clc_lgamma_r((float)x, iptr);593}594 595#endif596 597#define __CLC_FUNCTION __clc_lgamma_r598#define __CLC_ARG2_TYPE int599#define __CLC_ADDRSPACE private600#define __CLC_BODY <clc/shared/unary_def_with_ptr_scalarize.inc>601#include <clc/math/gentype.inc>602#undef __CLC_ADDRSPACE603#undef __CLC_ARG2_TYPE604#undef __CLC_FUNCTION605 606#define __CLC_ADDRSPACE global607#define __CLC_BODY <clc_lgamma_r.inc>608#include <clc/math/gentype.inc>609#undef __CLC_ADDRSPACE610 611#define __CLC_ADDRSPACE local612#define __CLC_BODY <clc_lgamma_r.inc>613#include <clc/math/gentype.inc>614#undef __CLC_ADDRSPACE615 616#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED617#define __CLC_ADDRSPACE generic618#define __CLC_BODY <clc_lgamma_r.inc>619#include <clc/math/gentype.inc>620#undef __CLC_ADDRSPACE621#endif622