Use glibc_likely instead __builtin_expect.
[jlayton/glibc.git] / math / w_pow.c
1 /* Copyright (C) 2011-2014 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 pow */
24 double
25 __pow (double x, double y)
26 {
27   double z = __ieee754_pow (x, y);
28   if (__glibc_unlikely (!__finite (z)))
29     {
30       if (_LIB_VERSION != _IEEE_)
31         {
32           if (__isnan (x))
33             {
34               if (y == 0.0)
35                 /* pow(NaN,0.0) */
36                 return __kernel_standard (x, y, 42);
37             }
38           else if (__finite (x) && __finite (y))
39             {
40               if (__isnan (z))
41                 /* pow neg**non-int */
42                 return __kernel_standard (x, y, 24);
43               else if (x == 0.0 && y < 0.0)
44                 {
45                   if (signbit (x) && signbit (z))
46                     /* pow(-0.0,negative) */
47                     return __kernel_standard (x, y, 23);
48                   else
49                     /* pow(+0.0,negative) */
50                     return __kernel_standard (x, y, 43);
51                 }
52               else
53                 /* pow overflow */
54                 return __kernel_standard (x, y, 21);
55             }
56         }
57     }
58   else if (__builtin_expect (z == 0.0, 0) && __finite (x) && __finite (y)
59            && _LIB_VERSION != _IEEE_)
60     {
61       if (x == 0.0)
62         {
63           if (y == 0.0)
64             /* pow(0.0,0.0) */
65             return __kernel_standard (x, y, 20);
66         }
67       else
68         /* pow underflow */
69         return __kernel_standard (x, y, 22);
70     }
71
72   return z;
73 }
74 weak_alias (__pow, pow)
75 #ifdef NO_LONG_DOUBLE
76 strong_alias (__pow, __powl)
77 weak_alias (__pow, powl)
78 #endif