Path: blob/main/system/lib/llvm-libc/include/llvm-libc-macros/stdfix-macros.h
6179 views
//===-- Definitions from stdfix.h -----------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_LIBC_MACROS_STDFIX_MACROS_H9#define LLVM_LIBC_MACROS_STDFIX_MACROS_H1011#ifdef __FRACT_FBIT__12// _Fract and _Accum types are available13#define LIBC_COMPILER_HAS_FIXED_POINT14#endif // __FRACT_FBIT__1516#ifdef LIBC_COMPILER_HAS_FIXED_POINT1718#define fract _Fract19#define accum _Accum20#define sat _Sat2122// Default values: from ISO/IEC TR 18037:2008 standard - Annex A.3 - Typical23// desktop processor.2425#ifdef __SFRACT_FBIT__26#define SFRACT_FBIT __SFRACT_FBIT__27#else28#define SFRACT_FBIT 729#endif // SFRACT_FBIT3031#ifdef __SFRACT_MIN__32#define SFRACT_MIN __SFRACT_MIN__33#else34#define SFRACT_MIN (-0.5HR - 0.5HR)35#endif // SFRACT_MIN3637#ifdef __SFRACT_MAX__38#define SFRACT_MAX __SFRACT_MAX__39#else40#define SFRACT_MAX 0x1.FCp-1HR41#endif // SFRACT_MAX4243#ifdef __SFRACT_EPSILON__44#define SFRACT_EPSILON __SFRACT_EPSILON__45#else46#define SFRACT_EPSILON 0x1.0p-7HR47#endif // SFRACT_EPSILON4849#ifdef __USFRACT_FBIT__50#define USFRACT_FBIT __USFRACT_FBIT__51#else52#define USFRACT_FBIT 853#endif // USFRACT_FBIT5455#define USFRACT_MIN 0.0UHR5657#ifdef __USFRACT_MAX__58#define USFRACT_MAX __USFRACT_MAX__59#else60#define USFRACT_MAX 0x1.FEp-1UHR61#endif // USFRACT_MAX6263#ifdef __USFRACT_EPSILON__64#define USFRACT_EPSILON __USFRACT_EPSILON__65#else66#define USFRACT_EPSILON 0x1.0p-8UHR67#endif // USFRACT_EPSILON6869#ifdef __FRACT_FBIT__70#define FRACT_FBIT __FRACT_FBIT__71#else72#define FRACT_FBIT 1573#endif // FRACT_FBIT7475#ifdef __FRACT_MIN__76#define FRACT_MIN __FRACT_MIN__77#else78#define FRACT_MIN (-0.5R - 0.5R)79#endif // FRACT_MIN8081#ifdef __FRACT_MAX__82#define FRACT_MAX __FRACT_MAX__83#else84#define FRACT_MAX 0x1.FFFCp-1R85#endif // FRACT_MAX8687#ifdef __FRACT_EPSILON__88#define FRACT_EPSILON __FRACT_EPSILON__89#else90#define FRACT_EPSILON 0x1.0p-15R91#endif // FRACT_EPSILON9293#ifdef __UFRACT_FBIT__94#define UFRACT_FBIT __UFRACT_FBIT__95#else96#define UFRACT_FBIT 1697#endif // UFRACT_FBIT9899#define UFRACT_MIN 0.0UR100101#ifdef __UFRACT_MAX__102#define UFRACT_MAX __UFRACT_MAX__103#else104#define UFRACT_MAX 0x1.FFFEp-1UR105#endif // UFRACT_MAX106107#ifdef __UFRACT_EPSILON__108#define UFRACT_EPSILON __UFRACT_EPSILON__109#else110#define UFRACT_EPSILON 0x1.0p-16UR111#endif // UFRACT_EPSILON112113#ifdef __LFRACT_FBIT__114#define LFRACT_FBIT __LFRACT_FBIT__115#else116#define LFRACT_FBIT 31117#endif // LFRACT_FBIT118119#ifdef __LFRACT_MIN__120#define LFRACT_MIN __LFRACT_MIN__121#else122#define LFRACT_MIN (-0.5LR - 0.5LR)123#endif // LFRACT_MIN124125#ifdef __LFRACT_MAX__126#define LFRACT_MAX __LFRACT_MAX__127#else128#define LFRACT_MAX 0x1.FFFFFFFCp-1LR129#endif // LFRACT_MAX130131#ifdef __LFRACT_EPSILON__132#define LFRACT_EPSILON __LFRACT_EPSILON__133#else134#define LFRACT_EPSILON 0x1.0p-31LR135#endif // LFRACT_EPSILON136137#ifdef __ULFRACT_FBIT__138#define ULFRACT_FBIT __ULFRACT_FBIT__139#else140#define ULFRACT_FBIT 32141#endif // ULFRACT_FBIT142143#define ULFRACT_MIN 0.0ULR144145#ifdef __ULFRACT_MAX__146#define ULFRACT_MAX __ULFRACT_MAX__147#else148#define ULFRACT_MAX 0x1.FFFFFFFEp-1ULR149#endif // ULFRACT_MAX150151#ifdef __ULFRACT_EPSILON__152#define ULFRACT_EPSILON __ULFRACT_EPSILON__153#else154#define ULFRACT_EPSILON 0x1.0p-32ULR155#endif // ULFRACT_EPSILON156157#ifdef __SACCUM_FBIT__158#define SACCUM_FBIT __SACCUM_FBIT__159#else160#define SACCUM_FBIT 7161#endif // SACCUM_FBIT162163#ifdef __SACCUM_IBIT__164#define SACCUM_IBIT __SACCUM_IBIT__165#else166#define SACCUM_IBIT 8167#endif // SACCUM_IBIT168169#ifdef __SACCUM_MIN__170#define SACCUM_MIN __SACCUM_MIN__171#else172#define SACCUM_MIN (-0x1.0p+7HK - 0x1.0p+7HK)173#endif // SACCUM_MIN174175#ifdef __SACCUM_MAX__176#define SACCUM_MAX __SACCUM_MAX__177#else178#define SACCUM_MAX 0x1.FFFCp+7HK179#endif // SACCUM_MAX180181#ifdef __SACCUM_EPSILON__182#define SACCUM_EPSILON __SACCUM_EPSILON__183#else184#define SACCUM_EPSILON 0x1.0p-7HK185#endif // SACCUM_EPSILON186187#ifdef __USACCUM_FBIT__188#define USACCUM_FBIT __USACCUM_FBIT__189#else190#define USACCUM_FBIT 8191#endif // USACCUM_FBIT192193#ifdef __USACCUM_IBIT__194#define USACCUM_IBIT __USACCUM_IBIT__195#else196#define USACCUM_IBIT 8197#endif // USACCUM_IBIT198199#define USACCUM_MIN 0.0UHK200201#ifdef __USACCUM_MAX__202#define USACCUM_MAX __USACCUM_MAX__203#else204#define USACCUM_MAX 0x1.FFFEp+7UHK205#endif // USACCUM_MAX206207#ifdef __USACCUM_EPSILON__208#define USACCUM_EPSILON __USACCUM_EPSILON__209#else210#define USACCUM_EPSILON 0x1.0p-8UHK211#endif // USACCUM_EPSILON212213#ifdef __ACCUM_FBIT__214#define ACCUM_FBIT __ACCUM_FBIT__215#else216#define ACCUM_FBIT 15217#endif // ACCUM_FBIT218219#ifdef __ACCUM_IBIT__220#define ACCUM_IBIT __ACCUM_IBIT__221#else222#define ACCUM_IBIT 16223#endif // ACCUM_IBIT224225#ifdef __ACCUM_MIN__226#define ACCUM_MIN __ACCUM_MIN__227#else228#define ACCUM_MIN (-0x1.0p+15K - 0x1.0p+15K)229#endif // ACCUM_MIN230231#ifdef __ACCUM_MAX__232#define ACCUM_MAX __ACCUM_MAX__233#else234#define ACCUM_MAX 0x1.FFFFFFFCp+15K235#endif // ACCUM_MAX236237#ifdef __ACCUM_EPSILON__238#define ACCUM_EPSILON __ACCUM_EPSILON__239#else240#define ACCUM_EPSILON 0x1.0p-15K241#endif // ACCUM_EPSILON242243#ifdef __UACCUM_FBIT__244#define UACCUM_FBIT __UACCUM_FBIT__245#else246#define UACCUM_FBIT 16247#endif // UACCUM_FBIT248249#ifdef __UACCUM_IBIT__250#define UACCUM_IBIT __UACCUM_IBIT__251#else252#define UACCUM_IBIT 16253#endif // UACCUM_IBIT254255#define UACCUM_MIN 0.0UK256257#ifdef __UACCUM_MAX__258#define UACCUM_MAX __UACCUM_MAX__259#else260#define UACCUM_MAX 0x1.FFFFFFFEp+15UK261#endif // UACCUM_MAX262263#ifdef __UACCUM_EPSILON__264#define UACCUM_EPSILON __UACCUM_EPSILON__265#else266#define UACCUM_EPSILON 0x1.0p-16UK267#endif // UACCUM_EPSILON268269#ifdef __LACCUM_FBIT__270#define LACCUM_FBIT __LACCUM_FBIT__271#else272#define LACCUM_FBIT 31273#endif // LACCUM_FBIT274275#ifdef __LACCUM_IBIT__276#define LACCUM_IBIT __LACCUM_IBIT__277#else278#define LACCUM_IBIT 32279#endif // LACCUM_IBIT280281#ifdef __LACCUM_MIN__282#define LACCUM_MIN __LACCUM_MIN__283#else284#define LACCUM_MIN (-0x1.0p+31LK - 0x1.0p+31LK)285#endif // LACCUM_MIN286287#ifdef __LACCUM_MAX__288#define LACCUM_MAX __LACCUM_MAX__289#else290#define LACCUM_MAX 0x1.FFFFFFFFFFFFFFFCp+31LK291#endif // LACCUM_MAX292293#ifdef __LACCUM_EPSILON__294#define LACCUM_EPSILON __LACCUM_EPSILON__295#else296#define LACCUM_EPSILON 0x1.0p-31LK297#endif // LACCUM_EPSILON298299#ifdef __ULACCUM_FBIT__300#define ULACCUM_FBIT __ULACCUM_FBIT__301#else302#define ULACCUM_FBIT 32303#endif // ULACCUM_FBIT304305#ifdef __ULACCUM_IBIT__306#define ULACCUM_IBIT __ULACCUM_IBIT__307#else308#define ULACCUM_IBIT 32309#endif // ULACCUM_IBIT310311#define ULACCUM_MIN 0.0ULK312313#ifdef __ULACCUM_MAX__314#define ULACCUM_MAX __ULACCUM_MAX__315#else316#define ULACCUM_MAX 0x1.FFFFFFFFFFFFFFFEp+31ULK317#endif // ULACCUM_MAX318319#ifdef __ULACCUM_EPSILON__320#define ULACCUM_EPSILON __ULACCUM_EPSILON__321#else322#define ULACCUM_EPSILON 0x1.0p-32ULK323#endif // ULACCUM_EPSILON324325#define absfx(x) \326_Generic((x), \327fract: absr, \328short fract: abshr, \329long fract: abslr, \330accum: absk, \331short accum: abshk, \332long accum: abslk)(x)333334#define countlsfx(x) \335_Generic((x), \336fract: countlsr, \337short fract: countlshr, \338long fract: countlslr, \339accum: countlsk, \340short accum: countlshk, \341long accum: countlslk, \342unsigned fract: countlsur, \343unsigned short fract: countlsuhr, \344unsigned long fract: countlsulr, \345unsigned accum: countlsuk, \346unsigned short accum: countlsuhk, \347unsigned long accum: countlsulk)(x)348349#define roundfx(x, y) \350_Generic((x), \351fract: roundr, \352short fract: roundhr, \353long fract: roundlr, \354accum: roundk, \355short accum: roundhk, \356long accum: roundlk, \357unsigned fract: roundur, \358unsigned short fract: rounduhr, \359unsigned long fract: roundulr, \360unsigned accum: rounduk, \361unsigned short accum: rounduhk, \362unsigned long accum: roundulk)(x, y)363364#endif // LIBC_COMPILER_HAS_FIXED_POINT365366#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H367368369