master
  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-exception
  6//
  7//===----------------------------------------------------------------------===//
  8
  9#ifndef LLVM_LIBC_MACROS_STDFIX_MACROS_H
 10#define LLVM_LIBC_MACROS_STDFIX_MACROS_H
 11
 12#ifdef __FRACT_FBIT__
 13// _Fract and _Accum types are available
 14#define LIBC_COMPILER_HAS_FIXED_POINT
 15#endif // __FRACT_FBIT__
 16
 17#ifdef LIBC_COMPILER_HAS_FIXED_POINT
 18
 19#define fract _Fract
 20#define accum _Accum
 21#define sat _Sat
 22
 23// Default values: from ISO/IEC TR 18037:2008 standard - Annex A.3 - Typical
 24// desktop processor.
 25
 26#ifdef __SFRACT_FBIT__
 27#define SFRACT_FBIT __SFRACT_FBIT__
 28#else
 29#define SFRACT_FBIT 7
 30#endif // SFRACT_FBIT
 31
 32#ifdef __SFRACT_MIN__
 33#define SFRACT_MIN __SFRACT_MIN__
 34#else
 35#define SFRACT_MIN (-0.5HR - 0.5HR)
 36#endif // SFRACT_MIN
 37
 38#ifdef __SFRACT_MAX__
 39#define SFRACT_MAX __SFRACT_MAX__
 40#else
 41#define SFRACT_MAX 0x1.FCp-1HR
 42#endif // SFRACT_MAX
 43
 44#ifdef __SFRACT_EPSILON__
 45#define SFRACT_EPSILON __SFRACT_EPSILON__
 46#else
 47#define SFRACT_EPSILON 0x1.0p-7HR
 48#endif // SFRACT_EPSILON
 49
 50#ifdef __USFRACT_FBIT__
 51#define USFRACT_FBIT __USFRACT_FBIT__
 52#else
 53#define USFRACT_FBIT 8
 54#endif // USFRACT_FBIT
 55
 56#define USFRACT_MIN 0.0UHR
 57
 58#ifdef __USFRACT_MAX__
 59#define USFRACT_MAX __USFRACT_MAX__
 60#else
 61#define USFRACT_MAX 0x1.FEp-1UHR
 62#endif // USFRACT_MAX
 63
 64#ifdef __USFRACT_EPSILON__
 65#define USFRACT_EPSILON __USFRACT_EPSILON__
 66#else
 67#define USFRACT_EPSILON 0x1.0p-8UHR
 68#endif // USFRACT_EPSILON
 69
 70#ifdef __FRACT_FBIT__
 71#define FRACT_FBIT __FRACT_FBIT__
 72#else
 73#define FRACT_FBIT 15
 74#endif // FRACT_FBIT
 75
 76#ifdef __FRACT_MIN__
 77#define FRACT_MIN __FRACT_MIN__
 78#else
 79#define FRACT_MIN (-0.5R - 0.5R)
 80#endif // FRACT_MIN
 81
 82#ifdef __FRACT_MAX__
 83#define FRACT_MAX __FRACT_MAX__
 84#else
 85#define FRACT_MAX 0x1.FFFCp-1R
 86#endif // FRACT_MAX
 87
 88#ifdef __FRACT_EPSILON__
 89#define FRACT_EPSILON __FRACT_EPSILON__
 90#else
 91#define FRACT_EPSILON 0x1.0p-15R
 92#endif // FRACT_EPSILON
 93
 94#ifdef __UFRACT_FBIT__
 95#define UFRACT_FBIT __UFRACT_FBIT__
 96#else
 97#define UFRACT_FBIT 16
 98#endif // UFRACT_FBIT
 99
100#define UFRACT_MIN 0.0UR
101
102#ifdef __UFRACT_MAX__
103#define UFRACT_MAX __UFRACT_MAX__
104#else
105#define UFRACT_MAX 0x1.FFFEp-1UR
106#endif // UFRACT_MAX
107
108#ifdef __UFRACT_EPSILON__
109#define UFRACT_EPSILON __UFRACT_EPSILON__
110#else
111#define UFRACT_EPSILON 0x1.0p-16UR
112#endif // UFRACT_EPSILON
113
114#ifdef __LFRACT_FBIT__
115#define LFRACT_FBIT __LFRACT_FBIT__
116#else
117#define LFRACT_FBIT 31
118#endif // LFRACT_FBIT
119
120#ifdef __LFRACT_MIN__
121#define LFRACT_MIN __LFRACT_MIN__
122#else
123#define LFRACT_MIN (-0.5LR - 0.5LR)
124#endif // LFRACT_MIN
125
126#ifdef __LFRACT_MAX__
127#define LFRACT_MAX __LFRACT_MAX__
128#else
129#define LFRACT_MAX 0x1.FFFFFFFCp-1LR
130#endif // LFRACT_MAX
131
132#ifdef __LFRACT_EPSILON__
133#define LFRACT_EPSILON __LFRACT_EPSILON__
134#else
135#define LFRACT_EPSILON 0x1.0p-31LR
136#endif // LFRACT_EPSILON
137
138#ifdef __ULFRACT_FBIT__
139#define ULFRACT_FBIT __ULFRACT_FBIT__
140#else
141#define ULFRACT_FBIT 32
142#endif // ULFRACT_FBIT
143
144#define ULFRACT_MIN 0.0ULR
145
146#ifdef __ULFRACT_MAX__
147#define ULFRACT_MAX __ULFRACT_MAX__
148#else
149#define ULFRACT_MAX 0x1.FFFFFFFEp-1ULR
150#endif // ULFRACT_MAX
151
152#ifdef __ULFRACT_EPSILON__
153#define ULFRACT_EPSILON __ULFRACT_EPSILON__
154#else
155#define ULFRACT_EPSILON 0x1.0p-32ULR
156#endif // ULFRACT_EPSILON
157
158#ifdef __SACCUM_FBIT__
159#define SACCUM_FBIT __SACCUM_FBIT__
160#else
161#define SACCUM_FBIT 7
162#endif // SACCUM_FBIT
163
164#ifdef __SACCUM_IBIT__
165#define SACCUM_IBIT __SACCUM_IBIT__
166#else
167#define SACCUM_IBIT 8
168#endif // SACCUM_IBIT
169
170#ifdef __SACCUM_MIN__
171#define SACCUM_MIN __SACCUM_MIN__
172#else
173#define SACCUM_MIN (-0x1.0p+7HK - 0x1.0p+7HK)
174#endif // SACCUM_MIN
175
176#ifdef __SACCUM_MAX__
177#define SACCUM_MAX __SACCUM_MAX__
178#else
179#define SACCUM_MAX 0x1.FFFCp+7HK
180#endif // SACCUM_MAX
181
182#ifdef __SACCUM_EPSILON__
183#define SACCUM_EPSILON __SACCUM_EPSILON__
184#else
185#define SACCUM_EPSILON 0x1.0p-7HK
186#endif // SACCUM_EPSILON
187
188#ifdef __USACCUM_FBIT__
189#define USACCUM_FBIT __USACCUM_FBIT__
190#else
191#define USACCUM_FBIT 8
192#endif // USACCUM_FBIT
193
194#ifdef __USACCUM_IBIT__
195#define USACCUM_IBIT __USACCUM_IBIT__
196#else
197#define USACCUM_IBIT 8
198#endif // USACCUM_IBIT
199
200#define USACCUM_MIN 0.0UHK
201
202#ifdef __USACCUM_MAX__
203#define USACCUM_MAX __USACCUM_MAX__
204#else
205#define USACCUM_MAX 0x1.FFFEp+7UHK
206#endif // USACCUM_MAX
207
208#ifdef __USACCUM_EPSILON__
209#define USACCUM_EPSILON __USACCUM_EPSILON__
210#else
211#define USACCUM_EPSILON 0x1.0p-8UHK
212#endif // USACCUM_EPSILON
213
214#ifdef __ACCUM_FBIT__
215#define ACCUM_FBIT __ACCUM_FBIT__
216#else
217#define ACCUM_FBIT 15
218#endif // ACCUM_FBIT
219
220#ifdef __ACCUM_IBIT__
221#define ACCUM_IBIT __ACCUM_IBIT__
222#else
223#define ACCUM_IBIT 16
224#endif // ACCUM_IBIT
225
226#ifdef __ACCUM_MIN__
227#define ACCUM_MIN __ACCUM_MIN__
228#else
229#define ACCUM_MIN (-0x1.0p+15K - 0x1.0p+15K)
230#endif // ACCUM_MIN
231
232#ifdef __ACCUM_MAX__
233#define ACCUM_MAX __ACCUM_MAX__
234#else
235#define ACCUM_MAX 0x1.FFFFFFFCp+15K
236#endif // ACCUM_MAX
237
238#ifdef __ACCUM_EPSILON__
239#define ACCUM_EPSILON __ACCUM_EPSILON__
240#else
241#define ACCUM_EPSILON 0x1.0p-15K
242#endif // ACCUM_EPSILON
243
244#ifdef __UACCUM_FBIT__
245#define UACCUM_FBIT __UACCUM_FBIT__
246#else
247#define UACCUM_FBIT 16
248#endif // UACCUM_FBIT
249
250#ifdef __UACCUM_IBIT__
251#define UACCUM_IBIT __UACCUM_IBIT__
252#else
253#define UACCUM_IBIT 16
254#endif // UACCUM_IBIT
255
256#define UACCUM_MIN 0.0UK
257
258#ifdef __UACCUM_MAX__
259#define UACCUM_MAX __UACCUM_MAX__
260#else
261#define UACCUM_MAX 0x1.FFFFFFFEp+15UK
262#endif // UACCUM_MAX
263
264#ifdef __UACCUM_EPSILON__
265#define UACCUM_EPSILON __UACCUM_EPSILON__
266#else
267#define UACCUM_EPSILON 0x1.0p-16UK
268#endif // UACCUM_EPSILON
269
270#ifdef __LACCUM_FBIT__
271#define LACCUM_FBIT __LACCUM_FBIT__
272#else
273#define LACCUM_FBIT 31
274#endif // LACCUM_FBIT
275
276#ifdef __LACCUM_IBIT__
277#define LACCUM_IBIT __LACCUM_IBIT__
278#else
279#define LACCUM_IBIT 32
280#endif // LACCUM_IBIT
281
282#ifdef __LACCUM_MIN__
283#define LACCUM_MIN __LACCUM_MIN__
284#else
285#define LACCUM_MIN (-0x1.0p+31LK - 0x1.0p+31LK)
286#endif // LACCUM_MIN
287
288#ifdef __LACCUM_MAX__
289#define LACCUM_MAX __LACCUM_MAX__
290#else
291#define LACCUM_MAX 0x1.FFFFFFFFFFFFFFFCp+31LK
292#endif // LACCUM_MAX
293
294#ifdef __LACCUM_EPSILON__
295#define LACCUM_EPSILON __LACCUM_EPSILON__
296#else
297#define LACCUM_EPSILON 0x1.0p-31LK
298#endif // LACCUM_EPSILON
299
300#ifdef __ULACCUM_FBIT__
301#define ULACCUM_FBIT __ULACCUM_FBIT__
302#else
303#define ULACCUM_FBIT 32
304#endif // ULACCUM_FBIT
305
306#ifdef __ULACCUM_IBIT__
307#define ULACCUM_IBIT __ULACCUM_IBIT__
308#else
309#define ULACCUM_IBIT 32
310#endif // ULACCUM_IBIT
311
312#define ULACCUM_MIN 0.0ULK
313
314#ifdef __ULACCUM_MAX__
315#define ULACCUM_MAX __ULACCUM_MAX__
316#else
317#define ULACCUM_MAX 0x1.FFFFFFFFFFFFFFFEp+31ULK
318#endif // ULACCUM_MAX
319
320#ifdef __ULACCUM_EPSILON__
321#define ULACCUM_EPSILON __ULACCUM_EPSILON__
322#else
323#define ULACCUM_EPSILON 0x1.0p-32ULK
324#endif // ULACCUM_EPSILON
325
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_POINT
366
367#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H