1/* 2 * Copyright 2015-2021 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 /* One's 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# ifndef INT128_MAX 65# if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16 66typedef __int128_t int128_t; 67typedef __uint128_t uint128_t; 68# define INT128_MIN __MININT__(int128_t) 69# define INT128_MAX __MAXINT__(int128_t) 70# define UINT128_MAX __MAXUINT__(uint128_t) 71# endif 72# endif 73 74# ifndef SIZE_MAX 75# define SIZE_MAX __MAXUINT__(size_t) 76# endif 77 78# ifndef OSSL_INTMAX_MAX 79# define OSSL_INTMAX_MIN __MININT__(ossl_intmax_t) 80# define OSSL_INTMAX_MAX __MAXINT__(ossl_intmax_t) 81# define OSSL_UINTMAX_MAX __MAXUINT__(ossl_uintmax_t) 82# endif 83 84#endif 85 86