mips: Implement trunc with hardware floating-point rounding instruction

This commit is contained in:
Adhemerval Zanella 2023-12-26 16:52:19 -03:00
parent 28e3562609
commit b046c66f08
2 changed files with 40 additions and 0 deletions

View File

@ -26,6 +26,7 @@ enum round_mode
{
CEIL,
FLOOR,
TRUNC,
};
static inline double
@ -46,6 +47,9 @@ round_to_integer_double (enum round_mode mode, double x)
case FLOOR:
asm ("floor.l.d %0, %0" : "+f" (r));
break;
case TRUNC:
asm ("trunc.l.d %0, %0" : "+f" (r));
break;
}
libc_fesetenv (&fe);

View File

@ -0,0 +1,36 @@
/* Round to integer, toward zero. MIPS version.
Copyright (C) 2023 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
<https://www.gnu.org/licenses/>. */
#if ((__mips_fpr == 64) \
&& (__mips_hard_float == 1) \
&& ((__mips == 32 && __mips_isa_rev > 1) || __mips == 64))
#define NO_MATH_REDIRECT
#include <math.h>
#include <round_to_integer.h>
#include <libm-alias-double.h>
double
__trunc (double x)
{
return round_to_integer_double (TRUNC, x);
}
libm_alias_double (__trunc, trunc)
#else
# include <sysdeps/ieee754/dbl-64/s_trunc.c>
#endif