xref: /src/crypto/openssl/include/internal/numbers.h (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
1 /*
2  * Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #ifndef OSSL_INTERNAL_NUMBERS_H
11 #define OSSL_INTERNAL_NUMBERS_H
12 #pragma once
13 
14 #include <limits.h>
15 
16 #if (-1 & 3) == 0x03 /* Two's complement */
17 
18 #define __MAXUINT__(T) ((T) - 1)
19 #define __MAXINT__(T) ((T)((((T)1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
20 #define __MININT__(T) (-__MAXINT__(T) - 1)
21 
22 #elif (-1 & 3) == 0x02 /* Ones' complement */
23 
24 #define __MAXUINT__(T) (((T) - 1) + 1)
25 #define __MAXINT__(T) ((T)((((T)1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
26 #define __MININT__(T) (-__MAXINT__(T))
27 
28 #elif (-1 & 3) == 0x01 /* Sign/magnitude */
29 
30 #define __MAXINT__(T) ((T)(((((T)1) << ((sizeof(T) * CHAR_BIT) - 2)) - 1) | (((T)1) << ((sizeof(T) * CHAR_BIT) - 2))))
31 #define __MAXUINT__(T) ((T)(__MAXINT__(T) | (((T)1) << ((sizeof(T) * CHAR_BIT) - 1))))
32 #define __MININT__(T) (-__MAXINT__(T))
33 
34 #else
35 
36 #error "do not know the integer encoding on this architecture"
37 
38 #endif
39 
40 #ifndef INT8_MAX
41 #define INT8_MIN __MININT__(int8_t)
42 #define INT8_MAX __MAXINT__(int8_t)
43 #define UINT8_MAX __MAXUINT__(uint8_t)
44 #endif
45 
46 #ifndef INT16_MAX
47 #define INT16_MIN __MININT__(int16_t)
48 #define INT16_MAX __MAXINT__(int16_t)
49 #define UINT16_MAX __MAXUINT__(uint16_t)
50 #endif
51 
52 #ifndef INT32_MAX
53 #define INT32_MIN __MININT__(int32_t)
54 #define INT32_MAX __MAXINT__(int32_t)
55 #define UINT32_MAX __MAXUINT__(uint32_t)
56 #endif
57 
58 #ifndef INT64_MAX
59 #define INT64_MIN __MININT__(int64_t)
60 #define INT64_MAX __MAXINT__(int64_t)
61 #define UINT64_MAX __MAXUINT__(uint64_t)
62 #endif
63 
64 /*
65  * 64-bit processor with LP64 ABI
66  */
67 #ifdef SIXTY_FOUR_BIT_LONG
68 #ifndef UINT32_C
69 #define UINT32_C(c) (c)
70 #endif
71 #ifndef UINT64_C
72 #define UINT64_C(c) (c##UL)
73 #endif
74 #endif
75 
76 /*
77  * 64-bit processor other than LP64 ABI
78  */
79 #ifdef SIXTY_FOUR_BIT
80 #ifndef UINT32_C
81 #define UINT32_C(c) (c##UL)
82 #endif
83 #ifndef UINT64_C
84 #define UINT64_C(c) (c##ULL)
85 #endif
86 #endif
87 
88 #ifndef INT128_MAX
89 #if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16
90 typedef __int128_t int128_t;
91 typedef __uint128_t uint128_t;
92 #define INT128_MIN __MININT__(int128_t)
93 #define INT128_MAX __MAXINT__(int128_t)
94 #define UINT128_MAX __MAXUINT__(uint128_t)
95 #endif
96 #endif
97 
98 #ifndef SIZE_MAX
99 #define SIZE_MAX __MAXUINT__(size_t)
100 #endif
101 
102 #ifndef OSSL_INTMAX_MAX
103 #define OSSL_INTMAX_MIN __MININT__(ossl_intmax_t)
104 #define OSSL_INTMAX_MAX __MAXINT__(ossl_intmax_t)
105 #define OSSL_UINTMAX_MAX __MAXUINT__(ossl_uintmax_t)
106 #endif
107 
108 #endif
109