Add another fma test.
[platform/upstream/glibc.git] / math / w_powl.c
1 /* Copyright (C) 2011-2013 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <math.h>
20 #include <math_private.h>
21
22
23 /* wrapper powl */
24 long double
25 __powl (long double x, long double y)
26 {
27   long double z = __ieee754_powl (x, y);
28   if (__builtin_expect (!__finitel (z), 0))
29     {
30       if (_LIB_VERSION != _IEEE_)
31         {
32           if (__isnanl (x))
33             {
34               if (y == 0.0L)
35                 /* pow(NaN,0.0) */
36                 return __kernel_standard_l (x, y, 242);
37             }
38           else if (__finitel (x) && __finitel (y))
39             {
40               if (__isnanl (z))
41                 /* pow neg**non-int */
42                 return __kernel_standard_l (x, y, 224);
43               else if (x == 0.0L && y < 0.0L)
44                 {
45                   if (signbit (x) && signbit (z))
46                     /* pow(-0.0,negative) */
47                     return __kernel_standard_l (x, y, 223);
48                   else
49                     /* pow(+0.0,negative) */
50                     return __kernel_standard_l (x, y, 243);
51                 }
52               else
53                 /* pow overflow */
54                 return __kernel_standard_l (x, y, 221);
55             }
56         }
57     }
58   else if (__builtin_expect (z == 0.0L, 0) && __finitel (x) && __finitel (y)
59            && _LIB_VERSION != _IEEE_)
60     {
61       if (x == 0.0L)
62         {
63           if (y == 0.0L)
64             /* pow(0.0,0.0) */
65             return __kernel_standard_l (x, y, 220);
66         }
67       else
68         /* pow underflow */
69         return __kernel_standard_l (x, y, 222);
70     }
71
72   return z;
73 }
74 weak_alias (__powl, powl)