File: stdfix-macros.h

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,235,796 kB
  • sloc: cpp: 7,617,614; ansic: 1,433,901; asm: 1,058,726; python: 252,096; f90: 94,671; objc: 70,753; lisp: 42,813; pascal: 18,401; sh: 10,032; ml: 5,111; perl: 4,720; awk: 3,523; makefile: 3,401; javascript: 2,272; xml: 892; fortran: 770
file content (367 lines) | stat: -rw-r--r-- 9,646 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
//===-- Definitions from stdfix.h -----------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_MACROS_STDFIX_MACROS_H
#define LLVM_LIBC_MACROS_STDFIX_MACROS_H

#ifdef __FRACT_FBIT__
// _Fract and _Accum types are available
#define LIBC_COMPILER_HAS_FIXED_POINT
#endif // __FRACT_FBIT__

#ifdef LIBC_COMPILER_HAS_FIXED_POINT

#define fract _Fract
#define accum _Accum
#define sat _Sat

// Default values: from ISO/IEC TR 18037:2008 standard - Annex A.3 - Typical
// desktop processor.

#ifdef __SFRACT_FBIT__
#define SFRACT_FBIT __SFRACT_FBIT__
#else
#define SFRACT_FBIT 7
#endif // SFRACT_FBIT

#ifdef __SFRACT_MIN__
#define SFRACT_MIN __SFRACT_MIN__
#else
#define SFRACT_MIN (-0.5HR - 0.5HR)
#endif // SFRACT_MIN

#ifdef __SFRACT_MAX__
#define SFRACT_MAX __SFRACT_MAX__
#else
#define SFRACT_MAX 0x1.FCp-1HR
#endif // SFRACT_MAX

#ifdef __SFRACT_EPSILON__
#define SFRACT_EPSILON __SFRACT_EPSILON__
#else
#define SFRACT_EPSILON 0x1.0p-7HR
#endif // SFRACT_EPSILON

#ifdef __USFRACT_FBIT__
#define USFRACT_FBIT __USFRACT_FBIT__
#else
#define USFRACT_FBIT 8
#endif // USFRACT_FBIT

#define USFRACT_MIN 0.0UHR

#ifdef __USFRACT_MAX__
#define USFRACT_MAX __USFRACT_MAX__
#else
#define USFRACT_MAX 0x1.FEp-1UHR
#endif // USFRACT_MAX

#ifdef __USFRACT_EPSILON__
#define USFRACT_EPSILON __USFRACT_EPSILON__
#else
#define USFRACT_EPSILON 0x1.0p-8UHR
#endif // USFRACT_EPSILON

#ifdef __FRACT_FBIT__
#define FRACT_FBIT __FRACT_FBIT__
#else
#define FRACT_FBIT 15
#endif // FRACT_FBIT

#ifdef __FRACT_MIN__
#define FRACT_MIN __FRACT_MIN__
#else
#define FRACT_MIN (-0.5R - 0.5R)
#endif // FRACT_MIN

#ifdef __FRACT_MAX__
#define FRACT_MAX __FRACT_MAX__
#else
#define FRACT_MAX 0x1.FFFCp-1R
#endif // FRACT_MAX

#ifdef __FRACT_EPSILON__
#define FRACT_EPSILON __FRACT_EPSILON__
#else
#define FRACT_EPSILON 0x1.0p-15R
#endif // FRACT_EPSILON

#ifdef __UFRACT_FBIT__
#define UFRACT_FBIT __UFRACT_FBIT__
#else
#define UFRACT_FBIT 16
#endif // UFRACT_FBIT

#define UFRACT_MIN 0.0UR

#ifdef __UFRACT_MAX__
#define UFRACT_MAX __UFRACT_MAX__
#else
#define UFRACT_MAX 0x1.FFFEp-1UR
#endif // UFRACT_MAX

#ifdef __UFRACT_EPSILON__
#define UFRACT_EPSILON __UFRACT_EPSILON__
#else
#define UFRACT_EPSILON 0x1.0p-16UR
#endif // UFRACT_EPSILON

#ifdef __LFRACT_FBIT__
#define LFRACT_FBIT __LFRACT_FBIT__
#else
#define LFRACT_FBIT 31
#endif // LFRACT_FBIT

#ifdef __LFRACT_MIN__
#define LFRACT_MIN __LFRACT_MIN__
#else
#define LFRACT_MIN (-0.5LR - 0.5LR)
#endif // LFRACT_MIN

#ifdef __LFRACT_MAX__
#define LFRACT_MAX __LFRACT_MAX__
#else
#define LFRACT_MAX 0x1.FFFFFFFCp-1LR
#endif // LFRACT_MAX

#ifdef __LFRACT_EPSILON__
#define LFRACT_EPSILON __LFRACT_EPSILON__
#else
#define LFRACT_EPSILON 0x1.0p-31LR
#endif // LFRACT_EPSILON

#ifdef __ULFRACT_FBIT__
#define ULFRACT_FBIT __ULFRACT_FBIT__
#else
#define ULFRACT_FBIT 32
#endif // ULFRACT_FBIT

#define ULFRACT_MIN 0.0ULR

#ifdef __ULFRACT_MAX__
#define ULFRACT_MAX __ULFRACT_MAX__
#else
#define ULFRACT_MAX 0x1.FFFFFFFEp-1ULR
#endif // ULFRACT_MAX

#ifdef __ULFRACT_EPSILON__
#define ULFRACT_EPSILON __ULFRACT_EPSILON__
#else
#define ULFRACT_EPSILON 0x1.0p-32ULR
#endif // ULFRACT_EPSILON

#ifdef __SACCUM_FBIT__
#define SACCUM_FBIT __SACCUM_FBIT__
#else
#define SACCUM_FBIT 7
#endif // SACCUM_FBIT

#ifdef __SACCUM_IBIT__
#define SACCUM_IBIT __SACCUM_IBIT__
#else
#define SACCUM_IBIT 8
#endif // SACCUM_IBIT

#ifdef __SACCUM_MIN__
#define SACCUM_MIN __SACCUM_MIN__
#else
#define SACCUM_MIN (-0x1.0p+7HK - 0x1.0p+7HK)
#endif // SACCUM_MIN

#ifdef __SACCUM_MAX__
#define SACCUM_MAX __SACCUM_MAX__
#else
#define SACCUM_MAX 0x1.FFFCp+7HK
#endif // SACCUM_MAX

#ifdef __SACCUM_EPSILON__
#define SACCUM_EPSILON __SACCUM_EPSILON__
#else
#define SACCUM_EPSILON 0x1.0p-7HK
#endif // SACCUM_EPSILON

#ifdef __USACCUM_FBIT__
#define USACCUM_FBIT __USACCUM_FBIT__
#else
#define USACCUM_FBIT 8
#endif // USACCUM_FBIT

#ifdef __USACCUM_IBIT__
#define USACCUM_IBIT __USACCUM_IBIT__
#else
#define USACCUM_IBIT 8
#endif // USACCUM_IBIT

#define USACCUM_MIN 0.0UHK

#ifdef __USACCUM_MAX__
#define USACCUM_MAX __USACCUM_MAX__
#else
#define USACCUM_MAX 0x1.FFFEp+7UHK
#endif // USACCUM_MAX

#ifdef __USACCUM_EPSILON__
#define USACCUM_EPSILON __USACCUM_EPSILON__
#else
#define USACCUM_EPSILON 0x1.0p-8UHK
#endif // USACCUM_EPSILON

#ifdef __ACCUM_FBIT__
#define ACCUM_FBIT __ACCUM_FBIT__
#else
#define ACCUM_FBIT 15
#endif // ACCUM_FBIT

#ifdef __ACCUM_IBIT__
#define ACCUM_IBIT __ACCUM_IBIT__
#else
#define ACCUM_IBIT 16
#endif // ACCUM_IBIT

#ifdef __ACCUM_MIN__
#define ACCUM_MIN __ACCUM_MIN__
#else
#define ACCUM_MIN (-0x1.0p+15K - 0x1.0p+15K)
#endif // ACCUM_MIN

#ifdef __ACCUM_MAX__
#define ACCUM_MAX __ACCUM_MAX__
#else
#define ACCUM_MAX 0x1.FFFFFFFCp+15K
#endif // ACCUM_MAX

#ifdef __ACCUM_EPSILON__
#define ACCUM_EPSILON __ACCUM_EPSILON__
#else
#define ACCUM_EPSILON 0x1.0p-15K
#endif // ACCUM_EPSILON

#ifdef __UACCUM_FBIT__
#define UACCUM_FBIT __UACCUM_FBIT__
#else
#define UACCUM_FBIT 16
#endif // UACCUM_FBIT

#ifdef __UACCUM_IBIT__
#define UACCUM_IBIT __UACCUM_IBIT__
#else
#define UACCUM_IBIT 16
#endif // UACCUM_IBIT

#define UACCUM_MIN 0.0UK

#ifdef __UACCUM_MAX__
#define UACCUM_MAX __UACCUM_MAX__
#else
#define UACCUM_MAX 0x1.FFFFFFFEp+15UK
#endif // UACCUM_MAX

#ifdef __UACCUM_EPSILON__
#define UACCUM_EPSILON __UACCUM_EPSILON__
#else
#define UACCUM_EPSILON 0x1.0p-16UK
#endif // UACCUM_EPSILON

#ifdef __LACCUM_FBIT__
#define LACCUM_FBIT __LACCUM_FBIT__
#else
#define LACCUM_FBIT 31
#endif // LACCUM_FBIT

#ifdef __LACCUM_IBIT__
#define LACCUM_IBIT __LACCUM_IBIT__
#else
#define LACCUM_IBIT 32
#endif // LACCUM_IBIT

#ifdef __LACCUM_MIN__
#define LACCUM_MIN __LACCUM_MIN__
#else
#define LACCUM_MIN (-0x1.0p+31LK - 0x1.0p+31LK)
#endif // LACCUM_MIN

#ifdef __LACCUM_MAX__
#define LACCUM_MAX __LACCUM_MAX__
#else
#define LACCUM_MAX 0x1.FFFFFFFFFFFFFFFCp+31LK
#endif // LACCUM_MAX

#ifdef __LACCUM_EPSILON__
#define LACCUM_EPSILON __LACCUM_EPSILON__
#else
#define LACCUM_EPSILON 0x1.0p-31LK
#endif // LACCUM_EPSILON

#ifdef __ULACCUM_FBIT__
#define ULACCUM_FBIT __ULACCUM_FBIT__
#else
#define ULACCUM_FBIT 32
#endif // ULACCUM_FBIT

#ifdef __ULACCUM_IBIT__
#define ULACCUM_IBIT __ULACCUM_IBIT__
#else
#define ULACCUM_IBIT 32
#endif // ULACCUM_IBIT

#define ULACCUM_MIN 0.0ULK

#ifdef __ULACCUM_MAX__
#define ULACCUM_MAX __ULACCUM_MAX__
#else
#define ULACCUM_MAX 0x1.FFFFFFFFFFFFFFFEp+31ULK
#endif // ULACCUM_MAX

#ifdef __ULACCUM_EPSILON__
#define ULACCUM_EPSILON __ULACCUM_EPSILON__
#else
#define ULACCUM_EPSILON 0x1.0p-32ULK
#endif // ULACCUM_EPSILON

#define absfx(x)                                                               \
  _Generic((x),                                                                \
      fract: absr,                                                             \
      short fract: abshr,                                                      \
      long fract: abslr,                                                       \
      accum: absk,                                                             \
      short accum: abshk,                                                      \
      long accum: abslk)(x)

#define countlsfx(x)                                                           \
  _Generic((x),                                                                \
      fract: countlsr,                                                         \
      short fract: countlshr,                                                  \
      long fract: countlslr,                                                   \
      accum: countlsk,                                                         \
      short accum: countlshk,                                                  \
      long accum: countlslk,                                                   \
      unsigned fract: countlsur,                                               \
      unsigned short fract: countlsuhr,                                        \
      unsigned long fract: countlsulr,                                         \
      unsigned accum: countlsuk,                                               \
      unsigned short accum: countlsuhk,                                        \
      unsigned long accum: countlsulk)(x)

#define roundfx(x, y)                                                          \
  _Generic((x),                                                                \
      fract: roundr,                                                           \
      short fract: roundhr,                                                    \
      long fract: roundlr,                                                     \
      accum: roundk,                                                           \
      short accum: roundhk,                                                    \
      long accum: roundlk,                                                     \
      unsigned fract: roundur,                                                 \
      unsigned short fract: rounduhr,                                          \
      unsigned long fract: roundulr,                                           \
      unsigned accum: rounduk,                                                 \
      unsigned short accum: rounduhk,                                          \
      unsigned long accum: roundulk)(x, y)

#endif // LIBC_COMPILER_HAS_FIXED_POINT

#endif // LLVM_LIBC_MACROS_STDFIX_MACROS_H