StdFix Functions

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

idivi

muli

rdivi

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.