]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc32/sparcv9/fpu/s_rint.S
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / sparc / sparc32 / sparcv9 / fpu / s_rint.S
CommitLineData
428d5830 1/* Round float to int floating-point values, sparc32 v9 version.
d4697bc9 2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
428d5830
DM
3 This file is part of the GNU C Library.
4 Contributed by David S. Miller <davem@davemloft.net>, 2012.
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
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
19
20#include <sysdep.h>
33f244f4 21#include <math_ldbl_opt.h>
428d5830
DM
22
23 /* We pop constants into the FPU registers using the incoming
d674b76d
DM
24 argument stack slots, since this avoid having to use any PIC
25 references. We also thus avoid having to allocate a register
26 window.
27
28 VIS instructions are used to facilitate the formation of
29 easier constants, and the propagation of the sign bit. */
428d5830
DM
30
31#define TWO_FIFTYTWO 0x43300000 /* 2**52 */
32
33#define ZERO %f10 /* 0.0 */
34#define SIGN_BIT %f12 /* -0.0 */
35
36ENTRY (__rint)
37 sethi %hi(TWO_FIFTYTWO), %o2
38 sllx %o0, 32, %o0
39
40 or %o0, %o1, %o0
41 fzero ZERO
42
43 stx %o0, [%sp + 72]
44 sllx %o2, 32, %o2
45 fnegd ZERO, SIGN_BIT
46
47 ldd [%sp + 72], %f0
48
49 stx %o2, [%sp + 72]
50 fabsd %f0, %f14
51
52 ldd [%sp + 72], %f16
53 fcmpd %fcc3, %f14, %f16
54
55 fmovduge %fcc3, ZERO, %f16
56 fand %f0, SIGN_BIT, SIGN_BIT
57
58 for %f16, SIGN_BIT, %f16
59 faddd %f0, %f16, %f6
60 fsubd %f6, %f16, %f0
61 fabsd %f0, %f0
62 retl
63 for %f0, SIGN_BIT, %f0
64END (__rint)
65weak_alias (__rint, rint)
33f244f4
DM
66
67#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
68compat_symbol (libm, __rint, rintl, GLIBC_2_0)
69#endif