]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/sparc32/sparcv9/fpu/s_rintf.S
INSTALL: regenerate
[thirdparty/glibc.git] / sysdeps / sparc / sparc32 / sparcv9 / fpu / s_rintf.S
CommitLineData
428d5830 1/* Round float to int floating-point values, sparc32 v9 version.
dff8da6b 2 Copyright (C) 2012-2024 Free Software Foundation, Inc.
428d5830 3 This file is part of the GNU C Library.
428d5830
DM
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
5a82c748 17 <https://www.gnu.org/licenses/>. */
428d5830
DM
18
19#include <sysdep.h>
3e5efdbd 20#include <libm-alias-float.h>
428d5830
DM
21
22 /* We pop constants into the FPU registers using the incoming
d674b76d
DM
23 argument stack slots, since this avoid having to use any PIC
24 references. We also thus avoid having to allocate a register
25 window.
26
27 VIS instructions are used to facilitate the formation of
28 easier constants, and the propagation of the sign bit. */
428d5830
DM
29
30#define TWO_TWENTYTHREE 0x4b000000 /* 2**23 */
31
32#define ZERO %f10 /* 0.0 */
33#define SIGN_BIT %f12 /* -0.0 */
34
35ENTRY (__rintf)
36 st %o0, [%sp + 68]
37 sethi %hi(TWO_TWENTYTHREE), %o2
38 fzeros ZERO
39
40 ld [%sp + 68], %f1
41 fnegs ZERO, SIGN_BIT
42
43 st %o2, [%sp + 68]
44 fabss %f1, %f14
45
46 ld [%sp + 68], %f16
47 fcmps %fcc3, %f14, %f16
48
49 fmovsuge %fcc3, ZERO, %f16
50 fands %f1, SIGN_BIT, SIGN_BIT
51
52 fors %f16, SIGN_BIT, %f16
53 fadds %f1, %f16, %f5
54 fsubs %f5, %f16, %f0
55 fabss %f0, %f0
56 retl
57 fors %f0, SIGN_BIT, %f0
58END (__rintf)
3e5efdbd 59libm_alias_float (__rint, rint)