power7-optimized classification functions
[glibc.git] / sysdeps / powerpc / powerpc32 / power7 / fpu / s_finite.S
blob5b0d950c74ce79ffb3bfdf89e013790976b4c119
1 /* finite().  PowerPC32/POWER7 version.
2    Copyright (C) 2010 Free Software Foundation, Inc.
3    Contributed by Luis Machado <luisgpm@br.ibm.com>.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <sysdep.h>
22 #include <math_ldbl_opt.h>
24 /* int __finite(x)  */
25         .section    .rodata.cst8,"aM",@progbits,8
26         .align 3
27 .LC0:   /* 1.0 */
28         .quad       0x3ff0000000000000
30         .section    ".text"
31         .type       __finite, @function
32         .machine    power7
33 ENTRY (__finite)
34 #ifdef SHARED
35         mflr    r11
36         cfi_register(lr,r11)
38         bcl     20,31,1f
39 1:      mflr    r9
40         addis   r9,r9,.LC0-1b@ha
41         lfd     fp0,.LC0-1b@l(r9)
43         mtlr    r11
44         cfi_same_value (lr)
45 #else
46         lis     r9,.LC0@ha
47         lfd     fp0,.LC0@l(r9)
48 #endif
49         ftdiv   cr7,fp1,fp0
50         li      r3,1
51         bflr    30
53         /* We have -INF/+INF/NaN or a denormal.  */
55         stwu    r1,-16(r1)    /* Allocate stack space.  */
56         stfd    fp1,8(r1)     /* Transfer FP to GPR's.  */
58         ori     2,2,0         /* Force a new dispatch group.  */
59         lhz     r0,8(r1)      /* Fetch the upper portion of the high word of
60                               the FP value (where the exponent and sign bits
61                               are).  */
62         clrlwi  r0,r0,17      /* r0 = abs(r0).  */
63         addi    r1,r1,16      /* Reset the stack pointer.  */
64         cmpwi   cr7,r0,0x7ff0 /* r4 == 0x7ff0?.  */
65         bltlr   cr7           /* LT means we have a denormal.  */
66         li      r3,0
67         blr
68         END (__finite)
70 hidden_def (__finite)
71 weak_alias (__finite, finite)
73 /* It turns out that the 'double' version will also always work for
74    single-precision.  */
75 strong_alias (__finite, __finitef)
76 hidden_def (__finitef)
77 weak_alias (__finitef, finitef)
79 #ifdef NO_LONG_DOUBLE
80 strong_alias (__finite, __finitel)
81 weak_alias (__finite, finitel)
82 #endif
84 #ifndef IS_IN_libm
85 # if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0)
86 compat_symbol (libc, __finite, __finitel, GLIBC_2_0);
87 compat_symbol (libc, finite, finitel, GLIBC_2_0);
88 # endif
89 #endif