Files
semi-libc/src/math/aarch64/llround.c
T
Szabolcs NagyandRich Felker 54807d47ac aarch64: add single instruction math functions
this should increase performance and reduce code size on aarch64.

the compiled code was checked against using __builtin_* instead
of inline asm with gcc-6.2.0.

lrint is two instructions.

c with inline asm is used because it is safer than a pure asm
implementation, this prevents ll{rint,round} to be an alias
of l{rint,round} (because the types don't match) and depends
on gcc style inline asm support.

ceil, floor, round, trunc can either raise inexact on finite
non-integer inputs or not raise any exceptions. the new
implementation does not raise exceptions while the generic
c code does.

on aarch64, the underflow exception is signaled before rounding
(ieee 754 allows both before and after rounding, but it must be
consistent), the generic fma c code signals it after rounding
so using single instruction fixes a slight conformance issue too.
2017-03-21 12:39:18 -04:00

9 lines
125 B
C

#include <math.h>
long long llround(double x)
{
long long n;
__asm__ ("fcvtas %x0, %d1" : "=r"(n) : "w"(x));
return n;
}