3.2.1 Calling fplib routines

Floating-point routines have names like __aeabi_dadd (add two doubles) and __aeabi_fdiv (divide two floats). User programs can call these routines directly.

Even in environments with a coprocessor, the routines are provided. They are typically only a few instructions long because all they do is execute the appropriate coprocessor instruction.

All the fplib routines are called using a software floating-point variant of the calling standard. This means that floating-point arguments are passed and returned in integer registers. By contrast, if the program is compiled for a coprocessor, floating-point data is passed in its floating-point registers.

So, for example, __aeabi_dadd takes a double in registers r0 and r1, and another double in registers r2 and r3, and returns the sum in r0 and r1.


For a double in registers r0 and r1, the register that holds the high 32 bits of the double depends on whether your program is little-endian or big-endian.

Software floating-point library routines are declared in one of two header files:

  • A small number of fplib routines that implement C99 functionality are declared in the standard header file math.h.
  • All other fplib routines are declared in the header file rt_fp.h. You can include this file if you want to call an fplib routine directly.

To call a function from assembler, the software floating-point function is named fn. For example, to call the nextafter() function, implement the following code:

IMPORT nextafter
BL nextafter
Non-ConfidentialPDF file icon PDF versionARM DUI0475M
Copyright © 2010-2016 ARM Limited or its affiliates. All rights reserved.