]>
Commit | Line | Data |
---|---|---|
a1267ba1 | 1 | /* Round to int floating-point values. PowerPC32 version. |
d4697bc9 | 2 | Copyright (C) 2011-2014 Free Software Foundation, Inc. |
a1267ba1 AZ |
3 | This file is part of the GNU C Library. |
4 | Contributed by Adhemerval Zanella <azanella@br.ibm.com>, 2011 | |
5 | ||
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. | |
10 | ||
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. | |
15 | ||
16 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
a1267ba1 AZ |
19 | |
20 | /* This has been coded in assembler because GCC makes such a mess of it | |
21 | when it's coded in C. */ | |
22 | ||
23 | #include <sysdep.h> | |
24 | #include <math_ldbl_opt.h> | |
25 | ||
26 | ||
27 | /* double [fp1] nearbyint(double [fp1] x) */ | |
28 | ||
29 | .section .rodata.cst4,"aM",@progbits,4 | |
30 | .align 2 | |
31 | .LC0: /* 2**52 */ | |
32 | .long 0x59800000 /* TWO52: 2**52 */ | |
33 | ||
34 | .section ".text" | |
35 | ENTRY (__nearbyint) | |
36 | #ifdef SHARED | |
37 | mflr r11 | |
38 | cfi_register(lr,r11) | |
39 | bcl 20,31,1f | |
40 | 1: mflr r9 | |
41 | addis r9,r9,.LC0-1b@ha | |
42 | lfs fp13,.LC0-1b@l(r9) | |
43 | mtlr r11 | |
44 | cfi_same_value (lr) | |
45 | #else | |
46 | lis r9,.LC0@ha | |
47 | lfs fp13,.LC0@l(r9) | |
48 | #endif | |
49 | fabs fp0,fp1 | |
50 | fsub fp12,fp13,fp13 /* generate 0.0 */ | |
51 | fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO52 */ | |
52 | bgelr cr7 | |
53 | fcmpu cr7,fp1,fp12 /* if (x > 0.0 */ | |
54 | ble cr7,L(lessthanzero) | |
55 | mtfsb0 4*cr7+lt /* Disable FE_INEXACT exception */ | |
56 | fadd fp0,fp1,fp13 /* x += TWO52 */ | |
57 | fsub fp1,fp0,fp13 /* x -= TWO52 */ | |
58 | fabs fp1,fp1 /* if (x == 0.0 */ | |
59 | mtfsb0 4*cr1+eq /* Clear any FE_INEXACT exception */ | |
60 | blr | |
61 | L(lessthanzero): | |
62 | bgelr cr7 | |
63 | mtfsb0 4*cr7+lt /* Disable FE_INEXACT exception */ | |
64 | fsub fp0,fp13,fp1 /* x -= TWO52 */ | |
65 | fsub fp0,fp0,fp13 /* x += TWO52 */ | |
66 | fneg fp1,fp0 /* if (x == 0.0) */ | |
67 | mtfsb0 4*cr1+eq /* Clear any FE_INEXACT exception */ | |
68 | blr | |
69 | END (__nearbyint) | |
70 | ||
71 | weak_alias (__nearbyint, nearbyint) | |
72 | ||
73 | #ifdef NO_LONG_DOUBLE | |
74 | weak_alias (__nearbyint, nearbyintl) | |
75 | strong_alias (__nearbyint, __nearbyintl) | |
76 | #endif | |
412bd966 AS |
77 | #if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1) |
78 | compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1) | |
a1267ba1 | 79 | #endif |