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