[PATCH 5/6] AArch64: Simplify lrint
Wilco Dijkstra
Wilco.Dijkstra@arm.com
Thu Feb 20 20:07:46 GMT 2025
Simplify lrint.
OK for commit?
---
diff --git a/sysdeps/aarch64/fpu/s_lrint.c b/sysdeps/aarch64/fpu/s_lrint.c
index 904c42ccd9418ff743575b1cf6ef9e83b3038770..66b3cca39952d3d4b1a3d0350620b05e96a170d2 100644
--- a/sysdeps/aarch64/fpu/s_lrint.c
+++ b/sysdeps/aarch64/fpu/s_lrint.c
@@ -22,60 +22,9 @@
#include <math-barriers.h>
#include <libm-alias-double.h>
-# define IREG_SIZE 64
-
-# ifdef __ILP32__
-# define OREG_SIZE 32
-# else
-# define OREG_SIZE 64
-# endif
-
-# define IREGS "d"
-
-#if OREG_SIZE == 32
-# define OREGS "w"
-#else
-# define OREGS "x"
-#endif
-
-
long int
__lrint (double x)
{
-
-#if IREG_SIZE == 64 && OREG_SIZE == 32
- long int result;
-
- if (__builtin_fabs (x) > INT32_MAX)
- {
- /* Converting large values to a 32 bit int may cause the frintx/fcvtza
- sequence to set both FE_INVALID and FE_INEXACT. To avoid this
- check the rounding mode and do a single instruction with the
- appropriate rounding mode. */
-
- switch (get_rounding_mode ())
- {
- case FE_TONEAREST:
- asm volatile ("fcvtns" "\t%" OREGS "0, %" IREGS "1"
- : "=r" (result) : "w" (x));
- break;
- case FE_UPWARD:
- asm volatile ("fcvtps" "\t%" OREGS "0, %" IREGS "1"
- : "=r" (result) : "w" (x));
- break;
- case FE_DOWNWARD:
- asm volatile ("fcvtms" "\t%" OREGS "0, %" IREGS "1"
- : "=r" (result) : "w" (x));
- break;
- case FE_TOWARDZERO:
- default:
- asm volatile ("fcvtzs" "\t%" OREGS "0, %" IREGS "1"
- : "=r" (result) : "w" (x));
- }
- return result;
- }
-#endif
-
double r = __builtin_rint (x);
/* Prevent gcc from calling lrint directly when compiled with
More information about the Libc-alpha
mailing list