368 lines · c
1//===-- Definitions from stdfix.h -----------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIBC_MACROS_STDFIX_MACROS_H10#define LLVM_LIBC_MACROS_STDFIX_MACROS_H11 12#ifdef __FRACT_FBIT__13// _Fract and _Accum types are available14#define LIBC_COMPILER_HAS_FIXED_POINT15#endif // __FRACT_FBIT__16 17#ifdef LIBC_COMPILER_HAS_FIXED_POINT18 19#define fract _Fract20#define accum _Accum21#define sat _Sat22 23// Default values: from ISO/IEC TR 18037:2008 standard - Annex A.3 - Typical24// desktop processor.25 26#ifdef __SFRACT_FBIT__27#define SFRACT_FBIT __SFRACT_FBIT__28#else29#define SFRACT_FBIT 730#endif // SFRACT_FBIT31 32#ifdef __SFRACT_MIN__33#define SFRACT_MIN __SFRACT_MIN__34#else35#define SFRACT_MIN (-0.5HR - 0.5HR)36#endif // SFRACT_MIN37 38#ifdef __SFRACT_MAX__39#define SFRACT_MAX __SFRACT_MAX__40#else41#define SFRACT_MAX 0x1.FCp-1HR42#endif // SFRACT_MAX43 44#ifdef __SFRACT_EPSILON__45#define SFRACT_EPSILON __SFRACT_EPSILON__46#else47#define SFRACT_EPSILON 0x1.0p-7HR48#endif // SFRACT_EPSILON49 50#ifdef __USFRACT_FBIT__51#define USFRACT_FBIT __USFRACT_FBIT__52#else53#define USFRACT_FBIT 854#endif // USFRACT_FBIT55 56#define USFRACT_MIN 0.0UHR57 58#ifdef __USFRACT_MAX__59#define USFRACT_MAX __USFRACT_MAX__60#else61#define USFRACT_MAX 0x1.FEp-1UHR62#endif // USFRACT_MAX63 64#ifdef __USFRACT_EPSILON__65#define USFRACT_EPSILON __USFRACT_EPSILON__66#else67#define USFRACT_EPSILON 0x1.0p-8UHR68#endif // USFRACT_EPSILON69 70#ifdef __FRACT_FBIT__71#define FRACT_FBIT __FRACT_FBIT__72#else73#define FRACT_FBIT 1574#endif // FRACT_FBIT75 76#ifdef __FRACT_MIN__77#define FRACT_MIN __FRACT_MIN__78#else79#define FRACT_MIN (-0.5R - 0.5R)80#endif // FRACT_MIN81 82#ifdef __FRACT_MAX__83#define FRACT_MAX __FRACT_MAX__84#else85#define FRACT_MAX 0x1.FFFCp-1R86#endif // FRACT_MAX87 88#ifdef __FRACT_EPSILON__89#define FRACT_EPSILON __FRACT_EPSILON__90#else91#define FRACT_EPSILON 0x1.0p-15R92#endif // FRACT_EPSILON93 94#ifdef __UFRACT_FBIT__95#define UFRACT_FBIT __UFRACT_FBIT__96#else97#define UFRACT_FBIT 1698#endif // UFRACT_FBIT99 100#define UFRACT_MIN 0.0UR101 102#ifdef __UFRACT_MAX__103#define UFRACT_MAX __UFRACT_MAX__104#else105#define UFRACT_MAX 0x1.FFFEp-1UR106#endif // UFRACT_MAX107 108#ifdef __UFRACT_EPSILON__109#define UFRACT_EPSILON __UFRACT_EPSILON__110#else111#define UFRACT_EPSILON 0x1.0p-16UR112#endif // UFRACT_EPSILON113 114#ifdef __LFRACT_FBIT__115#define LFRACT_FBIT __LFRACT_FBIT__116#else117#define LFRACT_FBIT 31118#endif // LFRACT_FBIT119 120#ifdef __LFRACT_MIN__121#define LFRACT_MIN __LFRACT_MIN__122#else123#define LFRACT_MIN (-0.5LR - 0.5LR)124#endif // LFRACT_MIN125 126#ifdef __LFRACT_MAX__127#define LFRACT_MAX __LFRACT_MAX__128#else129#define LFRACT_MAX 0x1.FFFFFFFCp-1LR130#endif // LFRACT_MAX131 132#ifdef __LFRACT_EPSILON__133#define LFRACT_EPSILON __LFRACT_EPSILON__134#else135#define LFRACT_EPSILON 0x1.0p-31LR136#endif // LFRACT_EPSILON137 138#ifdef __ULFRACT_FBIT__139#define ULFRACT_FBIT __ULFRACT_FBIT__140#else141#define ULFRACT_FBIT 32142#endif // ULFRACT_FBIT143 144#define ULFRACT_MIN 0.0ULR145 146#ifdef __ULFRACT_MAX__147#define ULFRACT_MAX __ULFRACT_MAX__148#else149#define ULFRACT_MAX 0x1.FFFFFFFEp-1ULR150#endif // ULFRACT_MAX151 152#ifdef __ULFRACT_EPSILON__153#define ULFRACT_EPSILON __ULFRACT_EPSILON__154#else155#define ULFRACT_EPSILON 0x1.0p-32ULR156#endif // ULFRACT_EPSILON157 158#ifdef __SACCUM_FBIT__159#define SACCUM_FBIT __SACCUM_FBIT__160#else161#define SACCUM_FBIT 7162#endif // SACCUM_FBIT163 164#ifdef __SACCUM_IBIT__165#define SACCUM_IBIT __SACCUM_IBIT__166#else167#define SACCUM_IBIT 8168#endif // SACCUM_IBIT169 170#ifdef __SACCUM_MIN__171#define SACCUM_MIN __SACCUM_MIN__172#else173#define SACCUM_MIN (-0x1.0p+7HK - 0x1.0p+7HK)174#endif // SACCUM_MIN175 176#ifdef __SACCUM_MAX__177#define SACCUM_MAX __SACCUM_MAX__178#else179#define SACCUM_MAX 0x1.FFFCp+7HK180#endif // SACCUM_MAX181 182#ifdef __SACCUM_EPSILON__183#define SACCUM_EPSILON __SACCUM_EPSILON__184#else185#define SACCUM_EPSILON 0x1.0p-7HK186#endif // SACCUM_EPSILON187 188#ifdef __USACCUM_FBIT__189#define USACCUM_FBIT __USACCUM_FBIT__190#else191#define USACCUM_FBIT 8192#endif // USACCUM_FBIT193 194#ifdef __USACCUM_IBIT__195#define USACCUM_IBIT __USACCUM_IBIT__196#else197#define USACCUM_IBIT 8198#endif // USACCUM_IBIT199 200#define USACCUM_MIN 0.0UHK201 202#ifdef __USACCUM_MAX__203#define USACCUM_MAX __USACCUM_MAX__204#else205#define USACCUM_MAX 0x1.FFFEp+7UHK206#endif // USACCUM_MAX207 208#ifdef __USACCUM_EPSILON__209#define USACCUM_EPSILON __USACCUM_EPSILON__210#else211#define USACCUM_EPSILON 0x1.0p-8UHK212#endif // USACCUM_EPSILON213 214#ifdef __ACCUM_FBIT__215#define ACCUM_FBIT __ACCUM_FBIT__216#else217#define ACCUM_FBIT 15218#endif // ACCUM_FBIT219 220#ifdef __ACCUM_IBIT__221#define ACCUM_IBIT __ACCUM_IBIT__222#else223#define ACCUM_IBIT 16224#endif // ACCUM_IBIT225 226#ifdef __ACCUM_MIN__227#define ACCUM_MIN __ACCUM_MIN__228#else229#define ACCUM_MIN (-0x1.0p+15K - 0x1.0p+15K)230#endif // ACCUM_MIN231 232#ifdef __ACCUM_MAX__233#define ACCUM_MAX __ACCUM_MAX__234#else235#define ACCUM_MAX 0x1.FFFFFFFCp+15K236#endif // ACCUM_MAX237 238#ifdef __ACCUM_EPSILON__239#define ACCUM_EPSILON __ACCUM_EPSILON__240#else241#define ACCUM_EPSILON 0x1.0p-15K242#endif // ACCUM_EPSILON243 244#ifdef __UACCUM_FBIT__245#define UACCUM_FBIT __UACCUM_FBIT__246#else247#define UACCUM_FBIT 16248#endif // UACCUM_FBIT249 250#ifdef __UACCUM_IBIT__251#define UACCUM_IBIT __UACCUM_IBIT__252#else253#define UACCUM_IBIT 16254#endif // UACCUM_IBIT255 256#define UACCUM_MIN 0.0UK257 258#ifdef __UACCUM_MAX__259#define UACCUM_MAX __UACCUM_MAX__260#else261#define UACCUM_MAX 0x1.FFFFFFFEp+15UK262#endif // UACCUM_MAX263 264#ifdef __UACCUM_EPSILON__265#define UACCUM_EPSILON __UACCUM_EPSILON__266#else267#define UACCUM_EPSILON 0x1.0p-16UK268#endif // UACCUM_EPSILON269 270#ifdef __LACCUM_FBIT__271#define LACCUM_FBIT __LACCUM_FBIT__272#else273#define LACCUM_FBIT 31274#endif // LACCUM_FBIT275 276#ifdef __LACCUM_IBIT__277#define LACCUM_IBIT __LACCUM_IBIT__278#else279#define LACCUM_IBIT 32280#endif // LACCUM_IBIT281 282#ifdef __LACCUM_MIN__283#define LACCUM_MIN __LACCUM_MIN__284#else285#define LACCUM_MIN (-0x1.0p+31LK - 0x1.0p+31LK)286#endif // LACCUM_MIN287 288#ifdef __LACCUM_MAX__289#define LACCUM_MAX __LACCUM_MAX__290#else291#define LACCUM_MAX 0x1.FFFFFFFFFFFFFFFCp+31LK292#endif // LACCUM_MAX293 294#ifdef __LACCUM_EPSILON__295#define LACCUM_EPSILON __LACCUM_EPSILON__296#else297#define LACCUM_EPSILON 0x1.0p-31LK298#endif // LACCUM_EPSILON299 300#ifdef __ULACCUM_FBIT__301#define ULACCUM_FBIT __ULACCUM_FBIT__302#else303#define ULACCUM_FBIT 32304#endif // ULACCUM_FBIT305 306#ifdef __ULACCUM_IBIT__307#define ULACCUM_IBIT __ULACCUM_IBIT__308#else309#define ULACCUM_IBIT 32310#endif // ULACCUM_IBIT311 312#define ULACCUM_MIN 0.0ULK313 314#ifdef __ULACCUM_MAX__315#define ULACCUM_MAX __ULACCUM_MAX__316#else317#define ULACCUM_MAX 0x1.FFFFFFFFFFFFFFFEp+31ULK318#endif // ULACCUM_MAX319 320#ifdef __ULACCUM_EPSILON__321#define ULACCUM_EPSILON __ULACCUM_EPSILON__322#else323#define ULACCUM_EPSILON 0x1.0p-32ULK324#endif // ULACCUM_EPSILON325 326#define absfx(x) \327 _Generic((x), \328 fract: absr, \329 short fract: abshr, \330 long fract: abslr, \331 accum: absk, \332 short accum: abshk, \333 long accum: abslk)(x)334 335#define countlsfx(x) \336 _Generic((x), \337 fract: countlsr, \338 short fract: countlshr, \339 long fract: countlslr, \340 accum: countlsk, \341 short accum: countlshk, \342 long accum: countlslk, \343 unsigned fract: countlsur, \344 unsigned short fract: countlsuhr, \345 unsigned long fract: countlsulr, \346 unsigned accum: countlsuk, \347 unsigned short accum: countlsuhk, \348 unsigned long accum: countlsulk)(x)349 350#define roundfx(x, y) \351 _Generic((x), \352 fract: roundr, \353 short fract: roundhr, \354 long fract: roundlr, \355 accum: roundk, \356 short accum: roundhk, \357 long accum: roundlk, \358 unsigned fract: roundur, \359 unsigned short fract: rounduhr, \360 unsigned long fract: roundulr, \361 unsigned accum: rounduk, \362 unsigned short accum: rounduhk, \363 unsigned long accum: roundulk)(x, y)364 365#endif // LIBC_COMPILER_HAS_FIXED_POINT366 367#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H368