Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
3171aa2b
Commit
3171aa2b
authored
Jun 04, 2021
by
Piotr Caban
Committed by
Alexandre Julliard
Jun 04, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Import lgamma implementation from musl.
Signed-off-by:
Piotr Caban
<
piotr@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
7e6756d0
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
195 additions
and
21 deletions
+195
-21
configure
configure
+0
-1
configure.ac
configure.ac
+0
-1
math.c
dlls/msvcrt/math.c
+195
-1
unixlib.c
dlls/msvcrt/unixlib.c
+0
-14
unixlib.h
dlls/msvcrt/unixlib.h
+0
-1
config.h.in
include/config.h.in
+0
-3
No files found.
configure
View file @
3171aa2b
...
...
@@ -19620,7 +19620,6 @@ for ac_func in \
exp2
\
exp2f
\
fmaf
\
lgamma
\
lgammaf
\
tgamma
\
tgammaf
...
...
configure.ac
View file @
3171aa2b
...
...
@@ -2659,7 +2659,6 @@ AC_CHECK_FUNCS(\
exp2 \
exp2f \
fmaf \
lgamma \
lgammaf \
tgamma \
tgammaf
...
...
dlls/msvcrt/math.c
View file @
3171aa2b
...
...
@@ -8644,12 +8644,206 @@ end:
return
sx
?
-
x
:
x
;
}
/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */
static
double
sin_pi
(
double
x
)
{
static
const
double
pi
=
3.14159265358979311600e+00
;
int
n
;
/* spurious inexact if odd int */
x
=
2
.
0
*
(
x
*
0
.
5
-
floor
(
x
*
0
.
5
));
/* x mod 2.0 */
n
=
(
int
)(
x
*
4
.
0
);
n
=
(
n
+
1
)
/
2
;
x
-=
n
*
0
.
5
f
;
x
*=
pi
;
switch
(
n
)
{
default:
/* case 4: */
case
0
:
return
__sin
(
x
,
0
.
0
,
0
);
case
1
:
return
__cos
(
x
,
0
.
0
);
case
2
:
return
__sin
(
-
x
,
0
.
0
,
0
);
case
3
:
return
-
__cos
(
x
,
0
.
0
);
}
}
/*********************************************************************
* lgamma (MSVCR120.@)
*
* Copied from musl: src/math/lgamma_r.c
*/
double
CDECL
lgamma
(
double
x
)
{
return
unix_funcs
->
lgamma
(
x
);
static
const
double
pi
=
3.14159265358979311600e+00
,
a0
=
7.72156649015328655494e-02
,
a1
=
3.22467033424113591611e-01
,
a2
=
6.73523010531292681824e-02
,
a3
=
2.05808084325167332806e-02
,
a4
=
7.38555086081402883957e-03
,
a5
=
2.89051383673415629091e-03
,
a6
=
1.19270763183362067845e-03
,
a7
=
5.10069792153511336608e-04
,
a8
=
2.20862790713908385557e-04
,
a9
=
1.08011567247583939954e-04
,
a10
=
2.52144565451257326939e-05
,
a11
=
4.48640949618915160150e-05
,
tc
=
1.46163214496836224576e+00
,
tf
=
-
1.21486290535849611461e-01
,
tt
=
-
3.63867699703950536541e-18
,
t0
=
4.83836122723810047042e-01
,
t1
=
-
1.47587722994593911752e-01
,
t2
=
6.46249402391333854778e-02
,
t3
=
-
3.27885410759859649565e-02
,
t4
=
1.79706750811820387126e-02
,
t5
=
-
1.03142241298341437450e-02
,
t6
=
6.10053870246291332635e-03
,
t7
=
-
3.68452016781138256760e-03
,
t8
=
2.25964780900612472250e-03
,
t9
=
-
1.40346469989232843813e-03
,
t10
=
8.81081882437654011382e-04
,
t11
=
-
5.38595305356740546715e-04
,
t12
=
3.15632070903625950361e-04
,
t13
=
-
3.12754168375120860518e-04
,
t14
=
3.35529192635519073543e-04
,
u0
=
-
7.72156649015328655494e-02
,
u1
=
6.32827064025093366517e-01
,
u2
=
1.45492250137234768737e+00
,
u3
=
9.77717527963372745603e-01
,
u4
=
2.28963728064692451092e-01
,
u5
=
1.33810918536787660377e-02
,
v1
=
2.45597793713041134822e+00
,
v2
=
2.12848976379893395361e+00
,
v3
=
7.69285150456672783825e-01
,
v4
=
1.04222645593369134254e-01
,
v5
=
3.21709242282423911810e-03
,
s0
=
-
7.72156649015328655494e-02
,
s1
=
2.14982415960608852501e-01
,
s2
=
3.25778796408930981787e-01
,
s3
=
1.46350472652464452805e-01
,
s4
=
2.66422703033638609560e-02
,
s5
=
1.84028451407337715652e-03
,
s6
=
3.19475326584100867617e-05
,
r1
=
1.39200533467621045958e+00
,
r2
=
7.21935547567138069525e-01
,
r3
=
1.71933865632803078993e-01
,
r4
=
1.86459191715652901344e-02
,
r5
=
7.77942496381893596434e-04
,
r6
=
7.32668430744625636189e-06
,
w0
=
4.18938533204672725052e-01
,
w1
=
8.33333333333329678849e-02
,
w2
=
-
2.77777777728775536470e-03
,
w3
=
7.93650558643019558500e-04
,
w4
=
-
5.95187557450339963135e-04
,
w5
=
8.36339918996282139126e-04
,
w6
=
-
1.63092934096575273989e-03
;
union
{
double
f
;
UINT64
i
;}
u
=
{
x
};
double
t
,
y
,
z
,
nadj
,
p
,
p1
,
p2
,
p3
,
q
,
r
,
w
;
UINT32
ix
;
int
sign
,
i
;
/* purge off +-inf, NaN, +-0, tiny and negative arguments */
sign
=
u
.
i
>>
63
;
ix
=
u
.
i
>>
32
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
return
x
*
x
;
if
(
ix
<
(
0x3ff
-
70
)
<<
20
)
{
/* |x|<2**-70, return -log(|x|) */
if
(
sign
)
x
=
-
x
;
return
-
log
(
x
);
}
if
(
sign
)
{
x
=
-
x
;
t
=
sin_pi
(
x
);
if
(
t
==
0
.
0
)
{
/* -integer */
*
_errno
()
=
ERANGE
;
return
1
.
0
/
(
x
-
x
);
}
if
(
t
<=
0
.
0
)
t
=
-
t
;
nadj
=
log
(
pi
/
(
t
*
x
));
}
/* purge off 1 and 2 */
if
((
ix
==
0x3ff00000
||
ix
==
0x40000000
)
&&
(
UINT32
)
u
.
i
==
0
)
r
=
0
;
/* for x < 2.0 */
else
if
(
ix
<
0x40000000
)
{
if
(
ix
<=
0x3feccccc
)
{
/* lgamma(x) = lgamma(x+1)-log(x) */
r
=
-
log
(
x
);
if
(
ix
>=
0x3FE76944
)
{
y
=
1
.
0
-
x
;
i
=
0
;
}
else
if
(
ix
>=
0x3FCDA661
)
{
y
=
x
-
(
tc
-
1
.
0
);
i
=
1
;
}
else
{
y
=
x
;
i
=
2
;
}
}
else
{
r
=
0
.
0
;
if
(
ix
>=
0x3FFBB4C3
)
{
/* [1.7316,2] */
y
=
2
.
0
-
x
;
i
=
0
;
}
else
if
(
ix
>=
0x3FF3B4C4
)
{
/* [1.23,1.73] */
y
=
x
-
tc
;
i
=
1
;
}
else
{
y
=
x
-
1
.
0
;
i
=
2
;
}
}
switch
(
i
)
{
case
0
:
z
=
y
*
y
;
p1
=
a0
+
z
*
(
a2
+
z
*
(
a4
+
z
*
(
a6
+
z
*
(
a8
+
z
*
a10
))));
p2
=
z
*
(
a1
+
z
*
(
a3
+
z
*
(
a5
+
z
*
(
a7
+
z
*
(
a9
+
z
*
a11
)))));
p
=
y
*
p1
+
p2
;
r
+=
(
p
-
0
.
5
*
y
);
break
;
case
1
:
z
=
y
*
y
;
w
=
z
*
y
;
p1
=
t0
+
w
*
(
t3
+
w
*
(
t6
+
w
*
(
t9
+
w
*
t12
)));
/* parallel comp */
p2
=
t1
+
w
*
(
t4
+
w
*
(
t7
+
w
*
(
t10
+
w
*
t13
)));
p3
=
t2
+
w
*
(
t5
+
w
*
(
t8
+
w
*
(
t11
+
w
*
t14
)));
p
=
z
*
p1
-
(
tt
-
w
*
(
p2
+
y
*
p3
));
r
+=
tf
+
p
;
break
;
case
2
:
p1
=
y
*
(
u0
+
y
*
(
u1
+
y
*
(
u2
+
y
*
(
u3
+
y
*
(
u4
+
y
*
u5
)))));
p2
=
1
.
0
+
y
*
(
v1
+
y
*
(
v2
+
y
*
(
v3
+
y
*
(
v4
+
y
*
v5
))));
r
+=
-
0
.
5
*
y
+
p1
/
p2
;
}
}
else
if
(
ix
<
0x40200000
)
{
/* x < 8.0 */
i
=
(
int
)
x
;
y
=
x
-
(
double
)
i
;
p
=
y
*
(
s0
+
y
*
(
s1
+
y
*
(
s2
+
y
*
(
s3
+
y
*
(
s4
+
y
*
(
s5
+
y
*
s6
))))));
q
=
1
.
0
+
y
*
(
r1
+
y
*
(
r2
+
y
*
(
r3
+
y
*
(
r4
+
y
*
(
r5
+
y
*
r6
)))));
r
=
0
.
5
*
y
+
p
/
q
;
z
=
1
.
0
;
/* lgamma(1+s) = log(s) + lgamma(s) */
switch
(
i
)
{
case
7
:
z
*=
y
+
6
.
0
;
/* fall through */
case
6
:
z
*=
y
+
5
.
0
;
/* fall through */
case
5
:
z
*=
y
+
4
.
0
;
/* fall through */
case
4
:
z
*=
y
+
3
.
0
;
/* fall through */
case
3
:
z
*=
y
+
2
.
0
;
r
+=
log
(
z
);
break
;
}
}
else
if
(
ix
<
0x43900000
)
{
/* 8.0 <= x < 2**58 */
t
=
log
(
x
);
z
=
1
.
0
/
x
;
y
=
z
*
z
;
w
=
w0
+
z
*
(
w1
+
y
*
(
w2
+
y
*
(
w3
+
y
*
(
w4
+
y
*
(
w5
+
y
*
w6
)))));
r
=
(
x
-
0
.
5
)
*
(
t
-
1
.
0
)
+
w
;
}
else
/* 2**58 <= x <= inf */
r
=
x
*
(
log
(
x
)
-
1
.
0
);
if
(
sign
)
r
=
nadj
-
r
;
return
r
;
}
/*********************************************************************
...
...
dlls/msvcrt/unixlib.c
View file @
3171aa2b
...
...
@@ -95,19 +95,6 @@ static float CDECL unix_fmaf( float x, float y, float z )
}
/*********************************************************************
* lgamma
*/
static
double
CDECL
unix_lgamma
(
double
x
)
{
#ifdef HAVE_LGAMMA
return
lgamma
(
x
);
#else
FIXME
(
"not implemented
\n
"
);
return
0
;
#endif
}
/*********************************************************************
* lgammaf
*/
static
float
CDECL
unix_lgammaf
(
float
x
)
...
...
@@ -169,7 +156,6 @@ static const struct unix_funcs funcs =
unix_exp2
,
unix_exp2f
,
unix_fmaf
,
unix_lgamma
,
unix_lgammaf
,
unix_pow
,
unix_powf
,
...
...
dlls/msvcrt/unixlib.h
View file @
3171aa2b
...
...
@@ -28,7 +28,6 @@ struct unix_funcs
double
(
CDECL
*
exp2
)(
double
x
);
float
(
CDECL
*
exp2f
)(
float
x
);
float
(
CDECL
*
fmaf
)(
float
x
,
float
y
,
float
z
);
double
(
CDECL
*
lgamma
)(
double
x
);
float
(
CDECL
*
lgammaf
)(
float
x
);
double
(
CDECL
*
pow
)(
double
x
,
double
y
);
float
(
CDECL
*
powf
)(
float
x
,
float
y
);
...
...
include/config.h.in
View file @
3171aa2b
...
...
@@ -297,9 +297,6 @@
/* Define to 1 if you have the `ldap_parse_vlv_control' function. */
#undef HAVE_LDAP_PARSE_VLV_CONTROL
/* Define to 1 if you have the `lgamma' function. */
#undef HAVE_LGAMMA
/* Define to 1 if you have the `lgammaf' function. */
#undef HAVE_LGAMMAF
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment