mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-12 20:20:18 +00:00
debf7618f6
The powerpc32 versions of ceil, floor, round, trunc, rint, nearbyint and their float versions return sNaN for sNaN input when they should return qNaN. This patch fixes them to add a NaN argument to itself to quiet sNaNs before returning. The powerpc64 versions, which have the same bug, will be addressed separately. Tested for powerpc32. [BZ #20160] * sysdeps/powerpc/powerpc32/fpu/s_ceil.S (__ceil): Add NaN argument to itself before returning the result. * sysdeps/powerpc/powerpc32/fpu/s_ceilf.S (__ceilf): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_floor.S (__floor): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_floorf.S (__floorf): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S (__nearbyint): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S (__nearbyintf): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_rint.S (__rint): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_rintf.S (__rintf): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_trunc.S (__trunc): Likewise. * sysdeps/powerpc/powerpc32/fpu/s_truncf.S (__truncf): Likewise.
66 lines
1.8 KiB
ArmAsm
66 lines
1.8 KiB
ArmAsm
/* Round float to int floating-point values. PowerPC32 version.
|
|
Copyright (C) 2004-2016 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <sysdep.h>
|
|
|
|
.section .rodata.cst4,"aM",@progbits,4
|
|
.align 2
|
|
.LC0: /* 2**23 */
|
|
.long 0x4b000000
|
|
|
|
.section ".text"
|
|
ENTRY (__rintf)
|
|
#ifdef SHARED
|
|
mflr r11
|
|
cfi_register(lr,r11)
|
|
SETUP_GOT_ACCESS(r9,got_label)
|
|
addis r9,r9,.LC0-got_label@ha
|
|
lfs fp13,.LC0-got_label@l(r9)
|
|
mtlr r11
|
|
cfi_same_value (lr)
|
|
#else
|
|
lis r9,.LC0@ha
|
|
lfs fp13,.LC0@l(r9)
|
|
#endif
|
|
fabs fp0,fp1
|
|
fsubs fp12,fp13,fp13 /* generate 0.0 */
|
|
fcmpu cr7,fp0,fp13 /* if (fabs(x) > TWO23) */
|
|
fcmpu cr6,fp1,fp12 /* if (x > 0.0) */
|
|
bnl cr7,.L10
|
|
bng cr6,.L4
|
|
fadds fp1,fp1,fp13 /* x+= TWO23; */
|
|
fsubs fp1,fp1,fp13 /* x-= TWO23; */
|
|
fabs fp1,fp1 /* if (x == 0.0) */
|
|
blr /* x = 0.0; */
|
|
.L4:
|
|
bnllr cr6 /* if (x < 0.0) */
|
|
fsubs fp1,fp1,fp13 /* x-= TWO23; */
|
|
fadds fp1,fp1,fp13 /* x+= TWO23; */
|
|
fnabs fp1,fp1 /* if (x == 0.0) */
|
|
blr /* x = -0.0; */
|
|
.L10:
|
|
/* Ensure sNaN input is converted to qNaN. */
|
|
fcmpu cr7,fp1,fp1
|
|
beqlr cr7
|
|
fadds fp1,fp1,fp1
|
|
blr
|
|
END (__rintf)
|
|
|
|
weak_alias (__rintf, rintf)
|
|
|