stdfix.h#

Standards and Goals#

  • stdfix.h is specified in the ISO/IEC TR 18037:2008, C extensions to support embedded processors .

  • Its specifications.

  • Our goal is to implement a complete set of math functions for fixed point types, most of them are currently not included in the ISO/IEC TR 18037:2008 standard. Our math functions for fixed point types are modeled after the C99/C23 math functions for floating point types.

Source location#

  • The main source for fixed-point functions is located at: libc/src/stdfix with subdirectories for internal implementations.

Implementation Status#

Requirements#

  • In order to build LLVM libc to support fixed-point arithmetics, we need the compiler to support the basic fixed-point types _Fract and _Accum in C++.

  • For the users to be able to use the generated headers, their compiler needs to support _Fract and _Accum types in C or C++.

  • This compiler support is checked at the beginning of libc/include/llvm-libc-macros/stdfix-macros.h.

Predefined Macros#

  • We use the macro LIBC_COMPILER_HAS_FIXED_POINT to specify whether the compiler support the fixed-point types.

  • Other predefined precision macros specified in section 7.18a.3 are defined in libc/include/llvm-libc-macros/stdfix-macros.h using the default configuration of typical desktop processor in section A.3.

Fixed-point Arithmetics#

The following functions are included in the ISO/IEC TR 18037:2008 standard.

Function Name

_Fract (r)

_Accum (k)

short (hr)

_ (r)

long (lr)

short (hk)

_ (k)

long (lk)

unsigned (uhr)

signed (hr)

unsigned (ur)

signed (r)

unsigned (ulr)

signed (lr)

unsigned (uhk)

signed (hk)

unsigned (uk)

signed (k)

unsigned (ulk)

signed (lk)

abs

✅

✅

✅

✅

✅

✅

bits*

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

*bits

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

countls

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

divi*

✅

✅

✅

✅

✅

✅

✅

✅

idiv*

✅

✅

✅

✅

✅

✅

✅

✅

muli

*divi

✅

✅

✅

✅

✅

✅

✅

✅

round

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

✅

Type Generic Macro

Available

absfx

✅

countlsfx

✅

roundfx

✅

Higher math functions#

The following math functions are modeled after C99/C23 math functions for floating point types, but are not part of the ISO/IEC TR 18037:2008 spec.

Function Name

_Fract (r)

_Accum (k)

short (hr)

_ (r)

long (lr)

short (hk)

_ (k)

long (lk)

unsigned (uhr)

signed (hr)

unsigned (ur)

signed (r)

unsigned (ulr)

signed (lr)

unsigned (uhk)

signed (hk)

unsigned (uk)

signed (k)

unsigned (ulk)

signed (lk)

cos

exp

✅

✅

log

sin

sqrt

✅

✅

✅

✅

✅

tan

Conversion Functions#

The following conversion functions are included in the ISO/IEC TR 18037:2008 standard.

Function Name

_Fract (r)

_Accum (k)

short (hr)

_ (r)

long (lr)

short (hk)

_ (k)

long (lk)

unsigned (uhr)

signed (hr)

unsigned (ur)

signed (r)

unsigned (ulr)

signed (lr)

unsigned (uhk)

signed (hk)

unsigned (uk)

signed (k)

unsigned (ulk)

signed (lk)

fprintf

fscanf

strtofx

Warnings#

This is currently a work-in-progress, its headers, macros, and ABI are still unstable, and might be modified.