]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc64/fpu/s_truncf.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc64 / fpu / s_truncf.S
CommitLineData
5ce98c3f 1/* truncf function. PowerPC64 version.
04277e02 2 Copyright (C) 2004-2019 Free Software Foundation, Inc.
5ce98c3f
UD
3 This file is part of the GNU C Library.
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
59ba27a6
PE
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
5ce98c3f
UD
18
19#include <sysdep.h>
216933b2 20#include <libm-alias-float.h>
5ce98c3f
UD
21
22 .section ".toc","aw"
76a66d51 23 .p2align 3
5ce98c3f 24.LC0: /* 2**23 */
76a66d51
AB
25 .long 0x4b000000
26 .long 0x0
5ce98c3f 27 .section ".text"
9c84384c 28
5ce98c3f
UD
29/* float [fp1] truncf (float x [fp1])
30 IEEE 1003.1 trunc function. IEEE specifies "trunc to the integer
9c84384c 31 value, in floating format, nearest to but no larger in magnitude
5ce98c3f
UD
32 then the argument."
33 We set "round toward Zero" mode and trunc by adding +-2**23 then
34 subtracting +-2**23. */
35
d5b41185 36ENTRY (__truncf, 4)
d7d06f79 37 CALL_MCOUNT 0
4d37c8aa 38 lfs fp13,.LC0@toc(2)
5ce98c3f
UD
39 fabs fp0,fp1
40 fsubs fp12,fp13,fp13 /* generate 0.0 */
41 fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
b4d80349
JM
42 mffs fp11 /* Save current FPU rounding mode and
43 "inexact" state. */
5ce98c3f 44 fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
f6ef0657 45 bnl- cr7,.L10
5ce98c3f
UD
46 mtfsfi 7,1 /* Set rounding toward 0 mode. */
47 ble- cr6,.L4
48 fadds fp1,fp1,fp13 /* x+= TWO23; */
49 fsubs fp1,fp1,fp13 /* x-= TWO23; */
4d37c8aa
UD
50 fabs fp1,fp1 /* if (x == 0.0) */
51 /* x = 0.0; */
b4d80349
JM
52 mtfsf 0xff,fp11 /* Restore previous rounding mode and
53 "inexact" state. */
5ce98c3f
UD
54 blr
55.L4:
56 bge- cr6,.L9 /* if (x < 0.0) */
57 fsubs fp1,fp1,fp13 /* x-= TWO23; */
58 fadds fp1,fp1,fp13 /* x+= TWO23; */
4d37c8aa
UD
59 fnabs fp1,fp1 /* if (x == 0.0) */
60 /* x = -0.0; */
61.L9:
b4d80349
JM
62 mtfsf 0xff,fp11 /* Restore previous rounding mode and
63 "inexact" state. */
5ce98c3f 64 blr
f6ef0657
JM
65.L10:
66 /* Ensure sNaN input is converted to qNaN. */
67 fcmpu cr7,fp1,fp1
68 beqlr cr7
69 fadds fp1,fp1,fp1
70 blr
5ce98c3f
UD
71 END (__truncf)
72
216933b2 73libm_alias_float (__trunc, trunc)
5ce98c3f 74