1e71b7053SJung-uk Kim /*
2*b077aed3SPierre Pronchery  * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim  */
9e71b7053SJung-uk Kim 
1017f01e99SJung-uk Kim #ifndef OSSL_INTERNAL_NUMBERS_H
1117f01e99SJung-uk Kim # define OSSL_INTERNAL_NUMBERS_H
12*b077aed3SPierre Pronchery # pragma once
13e71b7053SJung-uk Kim 
14e71b7053SJung-uk Kim # include <limits.h>
15e71b7053SJung-uk Kim 
16e71b7053SJung-uk Kim # if (-1 & 3) == 0x03           /* Two's complement */
17e71b7053SJung-uk Kim 
18e71b7053SJung-uk Kim #  define __MAXUINT__(T) ((T) -1)
19e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
20e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T) - 1)
21e71b7053SJung-uk Kim 
22e71b7053SJung-uk Kim # elif (-1 & 3) == 0x02         /* One's complement */
23e71b7053SJung-uk Kim 
24e71b7053SJung-uk Kim #  define __MAXUINT__(T) (((T) -1) + 1)
25e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
26e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T))
27e71b7053SJung-uk Kim 
28e71b7053SJung-uk Kim # elif (-1 & 3) == 0x01         /* Sign/magnitude */
29e71b7053SJung-uk Kim 
30e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) (((((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)) - 1) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 2))))
31e71b7053SJung-uk Kim #  define __MAXUINT__(T) ((T) (__MAXINT__(T) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 1))))
32e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T))
33e71b7053SJung-uk Kim 
34e71b7053SJung-uk Kim # else
35e71b7053SJung-uk Kim 
36e71b7053SJung-uk Kim #  error "do not know the integer encoding on this architecture"
37e71b7053SJung-uk Kim 
38e71b7053SJung-uk Kim # endif
39e71b7053SJung-uk Kim 
40e71b7053SJung-uk Kim # ifndef INT8_MAX
41e71b7053SJung-uk Kim #  define INT8_MIN __MININT__(int8_t)
42e71b7053SJung-uk Kim #  define INT8_MAX __MAXINT__(int8_t)
43e71b7053SJung-uk Kim #  define UINT8_MAX __MAXUINT__(uint8_t)
44e71b7053SJung-uk Kim # endif
45e71b7053SJung-uk Kim 
46e71b7053SJung-uk Kim # ifndef INT16_MAX
47e71b7053SJung-uk Kim #  define INT16_MIN __MININT__(int16_t)
48e71b7053SJung-uk Kim #  define INT16_MAX __MAXINT__(int16_t)
49e71b7053SJung-uk Kim #  define UINT16_MAX __MAXUINT__(uint16_t)
50e71b7053SJung-uk Kim # endif
51e71b7053SJung-uk Kim 
52e71b7053SJung-uk Kim # ifndef INT32_MAX
53e71b7053SJung-uk Kim #  define INT32_MIN __MININT__(int32_t)
54e71b7053SJung-uk Kim #  define INT32_MAX __MAXINT__(int32_t)
55e71b7053SJung-uk Kim #  define UINT32_MAX __MAXUINT__(uint32_t)
56e71b7053SJung-uk Kim # endif
57e71b7053SJung-uk Kim 
58e71b7053SJung-uk Kim # ifndef INT64_MAX
59e71b7053SJung-uk Kim #  define INT64_MIN __MININT__(int64_t)
60e71b7053SJung-uk Kim #  define INT64_MAX __MAXINT__(int64_t)
61e71b7053SJung-uk Kim #  define UINT64_MAX __MAXUINT__(uint64_t)
62e71b7053SJung-uk Kim # endif
63e71b7053SJung-uk Kim 
64*b077aed3SPierre Pronchery # ifndef INT128_MAX
65*b077aed3SPierre Pronchery #  if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16
66*b077aed3SPierre Pronchery typedef __int128_t int128_t;
67*b077aed3SPierre Pronchery typedef __uint128_t uint128_t;
68*b077aed3SPierre Pronchery #   define INT128_MIN __MININT__(int128_t)
69*b077aed3SPierre Pronchery #   define INT128_MAX __MAXINT__(int128_t)
70*b077aed3SPierre Pronchery #   define UINT128_MAX __MAXUINT__(uint128_t)
71*b077aed3SPierre Pronchery #  endif
72*b077aed3SPierre Pronchery # endif
73*b077aed3SPierre Pronchery 
74e71b7053SJung-uk Kim # ifndef SIZE_MAX
75e71b7053SJung-uk Kim #  define SIZE_MAX __MAXUINT__(size_t)
76e71b7053SJung-uk Kim # endif
77e71b7053SJung-uk Kim 
78*b077aed3SPierre Pronchery # ifndef OSSL_INTMAX_MAX
79*b077aed3SPierre Pronchery #  define OSSL_INTMAX_MIN __MININT__(ossl_intmax_t)
80*b077aed3SPierre Pronchery #  define OSSL_INTMAX_MAX __MAXINT__(ossl_intmax_t)
81*b077aed3SPierre Pronchery #  define OSSL_UINTMAX_MAX __MAXUINT__(ossl_uintmax_t)
82*b077aed3SPierre Pronchery # endif
83*b077aed3SPierre Pronchery 
84e71b7053SJung-uk Kim #endif
85e71b7053SJung-uk Kim 
86