brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 04097e1 Raw
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