diff --git a/sysdeps/aarch64/fpu/s_lrint.c b/sysdeps/aarch64/fpu/s_lrint.c
index 8c61a039bf..a6ac070fa6 100644
--- a/sysdeps/aarch64/fpu/s_lrint.c
+++ b/sysdeps/aarch64/fpu/s_lrint.c
@@ -17,6 +17,7 @@
. */
#include
+#include
#ifndef FUNC
# define FUNC lrint
@@ -43,10 +44,25 @@ OTYPE
__CONCATX(__,FUNC) (ITYPE x)
{
OTYPE result;
- ITYPE temp;
- asm ( "frintx" "\t%" IREGS "1, %" IREGS "2\n\t"
- "fcvtzs" "\t%" OREGS "0, %" IREGS "1"
- : "=r" (result), "=w" (temp) : "w" (x) );
+ 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;
+ default:
+ case FE_TOWARDZERO:
+ asm volatile ("fcvtzs" "\t%" OREGS "0, %" IREGS "1"
+ : "=r" (result) : "w" (x));
+ }
return result;
}