xref: /freebsd/crypto/openssl/include/internal/numbers.h (revision 17f01e9963948a18f55eb97173123702c5dae671)
1e71b7053SJung-uk Kim /*
2e71b7053SJung-uk Kim  * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4e71b7053SJung-uk Kim  * Licensed under the OpenSSL license (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 
10*17f01e99SJung-uk Kim #ifndef OSSL_INTERNAL_NUMBERS_H
11*17f01e99SJung-uk Kim # define OSSL_INTERNAL_NUMBERS_H
12e71b7053SJung-uk Kim 
13e71b7053SJung-uk Kim # include <limits.h>
14e71b7053SJung-uk Kim 
15e71b7053SJung-uk Kim # if (-1 & 3) == 0x03		/* Two's complement */
16e71b7053SJung-uk Kim 
17e71b7053SJung-uk Kim #  define __MAXUINT__(T) ((T) -1)
18e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
19e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T) - 1)
20e71b7053SJung-uk Kim 
21e71b7053SJung-uk Kim # elif (-1 & 3) == 0x02		/* One's complement */
22e71b7053SJung-uk Kim 
23e71b7053SJung-uk Kim #  define __MAXUINT__(T) (((T) -1) + 1)
24e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T)))
25e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T))
26e71b7053SJung-uk Kim 
27e71b7053SJung-uk Kim # elif (-1 & 3) == 0x01		/* Sign/magnitude */
28e71b7053SJung-uk Kim 
29e71b7053SJung-uk Kim #  define __MAXINT__(T) ((T) (((((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)) - 1) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 2))))
30e71b7053SJung-uk Kim #  define __MAXUINT__(T) ((T) (__MAXINT__(T) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 1))))
31e71b7053SJung-uk Kim #  define __MININT__(T) (-__MAXINT__(T))
32e71b7053SJung-uk Kim 
33e71b7053SJung-uk Kim # else
34e71b7053SJung-uk Kim 
35e71b7053SJung-uk Kim #  error "do not know the integer encoding on this architecture"
36e71b7053SJung-uk Kim 
37e71b7053SJung-uk Kim # endif
38e71b7053SJung-uk Kim 
39e71b7053SJung-uk Kim # ifndef INT8_MAX
40e71b7053SJung-uk Kim #  define INT8_MIN __MININT__(int8_t)
41e71b7053SJung-uk Kim #  define INT8_MAX __MAXINT__(int8_t)
42e71b7053SJung-uk Kim #  define UINT8_MAX __MAXUINT__(uint8_t)
43e71b7053SJung-uk Kim # endif
44e71b7053SJung-uk Kim 
45e71b7053SJung-uk Kim # ifndef INT16_MAX
46e71b7053SJung-uk Kim #  define INT16_MIN __MININT__(int16_t)
47e71b7053SJung-uk Kim #  define INT16_MAX __MAXINT__(int16_t)
48e71b7053SJung-uk Kim #  define UINT16_MAX __MAXUINT__(uint16_t)
49e71b7053SJung-uk Kim # endif
50e71b7053SJung-uk Kim 
51e71b7053SJung-uk Kim # ifndef INT32_MAX
52e71b7053SJung-uk Kim #  define INT32_MIN __MININT__(int32_t)
53e71b7053SJung-uk Kim #  define INT32_MAX __MAXINT__(int32_t)
54e71b7053SJung-uk Kim #  define UINT32_MAX __MAXUINT__(uint32_t)
55e71b7053SJung-uk Kim # endif
56e71b7053SJung-uk Kim 
57e71b7053SJung-uk Kim # ifndef INT64_MAX
58e71b7053SJung-uk Kim #  define INT64_MIN __MININT__(int64_t)
59e71b7053SJung-uk Kim #  define INT64_MAX __MAXINT__(int64_t)
60e71b7053SJung-uk Kim #  define UINT64_MAX __MAXUINT__(uint64_t)
61e71b7053SJung-uk Kim # endif
62e71b7053SJung-uk Kim 
63e71b7053SJung-uk Kim # ifndef SIZE_MAX
64e71b7053SJung-uk Kim #  define SIZE_MAX __MAXUINT__(size_t)
65e71b7053SJung-uk Kim # endif
66e71b7053SJung-uk Kim 
67e71b7053SJung-uk Kim #endif
68e71b7053SJung-uk Kim 
69