The trigonometric functions of children of Ada.Numerics are implemented by inline assembly statements on the x86 architecture, and for sin/cos/tan a special range reduction algorithm is used to avoid a loss of accuracy in range reduction implemented in hardware on x86 processors. This algorithm contains a rounding step and it was implemented inefficiently by a call to a routine of the runtime. This patch changes it to using a more efficient inline sequence of machine instructions instead. The same change is applied to the range reduction algorithm used prior to calling the libc routines on PowerPC/Darwin. The patch also changes the definition of the Double type used to interface the libc routines in other implementations so as to use the built-in type corresponding to the C type (Long_Float, except for Long_Long_Float on x86). Compiling the following package at -O2 -gnatpgn must yield no calls to the rounding routines of the runtime on x86: with Ada.Numerics.Generic_Elementary_Functions; package P is new Ada.Numerics.Generic_Elementary_Functions (Long_Float); Tested on x86_64-pc-linux-gnu, committed on trunk 2017-04-25 Eric Botcazou * a-numaux.ads: Fix description of a-numaux-darwin and a-numaux-x86. (Double): Define to Long_Float. * a-numaux-vxworks.ads (Double): Likewise. * a-numaux-darwin.ads (Double): Likewise. * a-numaux-libc-x86.ads (Double): Define to Long_Long_Float. * a-numaux-x86.ads: Fix package description. * a-numaux-x86.adb (Is_Nan): Minor tweak. (Reduce): Adjust and complete description. Call Is_Nan instead of testing manually. Use an integer temporary to hold rounded value. * a-numaux-darwin.adb (Reduce): Likewise. (Is_Nan): New function.