xref: /optee_os/lib/libutils/isoc/include/stdint.h (revision 9668cb1ec2d7281308eff80a4c7c30952c20745d)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2b0104773SPascal Brand /*
3b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
4b0104773SPascal Brand  */
5b0104773SPascal Brand 
6*9668cb1eSJens Wiklander #include <limits.h>
7*9668cb1eSJens Wiklander 
8b0104773SPascal Brand /*
9b0104773SPascal Brand  * This file provides what C99 standard requires in
10b0104773SPascal Brand  * 7.18 interger types <stdint.h>
11b0104773SPascal Brand  */
12b0104773SPascal Brand 
13b0104773SPascal Brand #ifndef STDINT_H
14b0104773SPascal Brand #define STDINT_H
15b0104773SPascal Brand #define _STDINT_H
16b0104773SPascal Brand 
171f60363aSJens Wiklander /*
181f60363aSJens Wiklander  * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out
191f60363aSJens Wiklander  * here.
201f60363aSJens Wiklander  */
211f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
221f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \
231f60363aSJens Wiklander 	defined(__SIZEOF_LONG__)
241f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4
251f60363aSJens Wiklander #define __ILP32__ 1
261f60363aSJens Wiklander #endif
271f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8
281f60363aSJens Wiklander #define __LP64__ 1
291f60363aSJens Wiklander #endif
301f60363aSJens Wiklander #endif
311f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */
321f60363aSJens Wiklander 
331f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
341f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined
351f60363aSJens Wiklander #endif
361f60363aSJens Wiklander 
37385e3901SJens Wiklander #ifndef ASM
38385e3901SJens Wiklander 
39b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */
40b0104773SPascal Brand #ifndef __int8_t_defined
41b0104773SPascal Brand # define __int8_t_defined
42b0104773SPascal Brand typedef signed char             int8_t;
43b0104773SPascal Brand typedef short int               int16_t;
44b0104773SPascal Brand typedef int                     int32_t;
451f60363aSJens Wiklander #ifdef __ILP32__
46b0104773SPascal Brand __extension__
47b0104773SPascal Brand typedef long long int           int64_t;
481f60363aSJens Wiklander #endif /*__ILP32__*/
491f60363aSJens Wiklander #ifdef __LP64__
501f60363aSJens Wiklander typedef long int		int64_t;
511f60363aSJens Wiklander #endif /*__LP64__*/
52b0104773SPascal Brand #endif
53b0104773SPascal Brand 
54b0104773SPascal Brand /* Unsigned.  */
55b0104773SPascal Brand typedef unsigned char           uint8_t;
56b0104773SPascal Brand typedef unsigned short int      uint16_t;
57b0104773SPascal Brand #ifndef __uint32_t_defined
58b0104773SPascal Brand typedef unsigned int            uint32_t;
59b0104773SPascal Brand # define __uint32_t_defined
60b0104773SPascal Brand #endif
611f60363aSJens Wiklander #ifdef __ILP32__
62b0104773SPascal Brand __extension__
63b0104773SPascal Brand typedef unsigned long long int  uint64_t;
641f60363aSJens Wiklander #endif /*__ILP32__*/
651f60363aSJens Wiklander #ifdef __LP64__
661f60363aSJens Wiklander typedef unsigned long int	uint64_t;
671f60363aSJens Wiklander #endif /*__LP64__*/
68b0104773SPascal Brand 
694c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */
704c1908d3SJens Wiklander typedef int8_t int_least8_t;
714c1908d3SJens Wiklander typedef int16_t int_least16_t;
724c1908d3SJens Wiklander typedef int32_t int_least32_t;
734c1908d3SJens Wiklander typedef int64_t int_least64_t;
744c1908d3SJens Wiklander typedef uint8_t uint_least8_t;
754c1908d3SJens Wiklander typedef uint16_t uint_least16_t;
764c1908d3SJens Wiklander typedef uint32_t uint_least32_t;
774c1908d3SJens Wiklander typedef uint64_t uint_least64_t;
784c1908d3SJens Wiklander 
794c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */
804c1908d3SJens Wiklander typedef int8_t int_fast8_t;
814c1908d3SJens Wiklander typedef int16_t int_fast16_t;
824c1908d3SJens Wiklander typedef int32_t int_fast32_t;
834c1908d3SJens Wiklander typedef int64_t int_fast64_t;
844c1908d3SJens Wiklander typedef uint8_t uint_fast8_t;
854c1908d3SJens Wiklander typedef uint16_t uint_fast16_t;
864c1908d3SJens Wiklander typedef uint32_t uint_fast32_t;
874c1908d3SJens Wiklander typedef uint64_t uint_fast64_t;
884c1908d3SJens Wiklander 
89b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */
901f60363aSJens Wiklander typedef long intptr_t;
911f60363aSJens Wiklander typedef unsigned long uintptr_t;
92b0104773SPascal Brand 
931f60363aSJens Wiklander typedef int64_t intmax_t;
941f60363aSJens Wiklander typedef uint64_t uintmax_t;
95b0104773SPascal Brand 
96385e3901SJens Wiklander #endif /*ASM*/
97385e3901SJens Wiklander 
98b0104773SPascal Brand /*
99b0104773SPascal Brand  * 7.18.2 Limits of specified-width integer types
100b0104773SPascal Brand  */
101b0104773SPascal Brand 
102b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */
103b0104773SPascal Brand 
104b0104773SPascal Brand #define INT8_MIN    (-0x7f-1)
105b0104773SPascal Brand #define INT16_MIN   (-0x7fff-1)
106b0104773SPascal Brand #define INT32_MIN   (-0x7fffffff-1)
107b0104773SPascal Brand #define INT64_MIN   (-0x7fffffffffffffffL-1)
108b0104773SPascal Brand 
109b0104773SPascal Brand #define INT8_MAX    0x7f
110b0104773SPascal Brand #define INT16_MAX   0x7fff
111b0104773SPascal Brand #define INT32_MAX   0x7fffffff
112b0104773SPascal Brand #define INT64_MAX   0x7fffffffffffffffL
113b0104773SPascal Brand 
114b0104773SPascal Brand #define UINT8_MAX    0xff
115b0104773SPascal Brand #define UINT16_MAX   0xffff
116b0104773SPascal Brand #define UINT32_MAX   0xffffffffU
117b0104773SPascal Brand #define UINT64_MAX   0xffffffffffffffffUL
118b0104773SPascal Brand 
1194c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */
1204c1908d3SJens Wiklander 
1214c1908d3SJens Wiklander #define INT_LEAST8_MIN		INT8_MIN
1224c1908d3SJens Wiklander #define INT_LEAST16_MIN		INT16_MIN
1234c1908d3SJens Wiklander #define INT_LEAST32_MIN		INT32_MIN
1244c1908d3SJens Wiklander #define INT_LEAST64_MIN		INT64_MIN
1254c1908d3SJens Wiklander 
1264c1908d3SJens Wiklander #define INT_LEAST8_MAX		INT8_MAX
1274c1908d3SJens Wiklander #define INT_LEAST16_MAX		INT16_MAX
1284c1908d3SJens Wiklander #define INT_LEAST32_MAX		INT32_MAX
1294c1908d3SJens Wiklander #define INT_LEAST64_MAX		INT64_MAX
1304c1908d3SJens Wiklander 
1314c1908d3SJens Wiklander #define UINT_LEAST8_MAX		UINT8_MAX
1324c1908d3SJens Wiklander #define UINT_LEAST16_MAX	UINT16_MAX
1334c1908d3SJens Wiklander #define UINT_LEAST32_MAX	UINT32_MAX
1344c1908d3SJens Wiklander #define UINT_LEAST64_MAX	UINT64_MAX
1354c1908d3SJens Wiklander 
1364c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */
1374c1908d3SJens Wiklander 
1384c1908d3SJens Wiklander #define INT_FAST8_MIN		INT8_MIN
1394c1908d3SJens Wiklander #define INT_FAST16_MIN		INT16_MIN
1404c1908d3SJens Wiklander #define INT_FAST32_MIN		INT32_MIN
1414c1908d3SJens Wiklander #define INT_FAST64_MIN		INT64_MIN
1424c1908d3SJens Wiklander 
1434c1908d3SJens Wiklander #define INT_FAST8_MAX		INT8_MAX
1444c1908d3SJens Wiklander #define INT_FAST16_MAX		INT16_MAX
1454c1908d3SJens Wiklander #define INT_FAST32_MAX		INT32_MAX
1464c1908d3SJens Wiklander #define INT_FAST64_MAX		INT64_MAX
1474c1908d3SJens Wiklander 
1484c1908d3SJens Wiklander #define UINT_FAST8_MAX		UINT8_MAX
1494c1908d3SJens Wiklander #define UINT_FAST16_MAX		UINT16_MAX
1504c1908d3SJens Wiklander #define UINT_FAST32_MAX		UINT32_MAX
1514c1908d3SJens Wiklander #define UINT_FAST64_MAX		UINT64_MAX
1524c1908d3SJens Wiklander 
153b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */
154b0104773SPascal Brand 
1551f60363aSJens Wiklander #define INTPTR_MIN  LONG_MIN
1561f60363aSJens Wiklander #define INTPTR_MAX  LONG_MAX
1571f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX
1581f60363aSJens Wiklander 
15939a6336dSJason Lin /* 7.18.2.5  Limits of greatest-width integer types */
1601f60363aSJens Wiklander #define INTMAX_MAX  INT64_MAX
1611f60363aSJens Wiklander #define INTMAX_MIN  INT64_MIN
1621f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX
163b0104773SPascal Brand 
16439a6336dSJason Lin /* 7.18.3  Limits of other integer types */
16539a6336dSJason Lin #define SIZE_MAX	ULONG_MAX
16639a6336dSJason Lin 
1674c1908d3SJens Wiklander /*
1684c1908d3SJens Wiklander  * 7.18.4 Macros for integer constants
1694c1908d3SJens Wiklander  */
1704c1908d3SJens Wiklander 
1714c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */
1724c1908d3SJens Wiklander 
1734c1908d3SJens Wiklander #define INT8_C(v)	v
1744c1908d3SJens Wiklander #define UINT8_C(v)	v
1754c1908d3SJens Wiklander #define INT16_C(v)	v
1764c1908d3SJens Wiklander #define UINT16_C(v)	v
1774c1908d3SJens Wiklander #define INT32_C(v)	v
1784c1908d3SJens Wiklander #define UINT32_C(v)	v ## U
1794c1908d3SJens Wiklander #ifdef __ILP32__
1804c1908d3SJens Wiklander #define INT64_C(v)	v ## LL
1814c1908d3SJens Wiklander #define UINT64_C(v)	v ## ULL
1824c1908d3SJens Wiklander #endif
1834c1908d3SJens Wiklander #ifdef __LP64__
1844c1908d3SJens Wiklander #define INT64_C(v)	v ## L
1854c1908d3SJens Wiklander #define UINT64_C(v)	v ## UL
1864c1908d3SJens Wiklander #endif
1874c1908d3SJens Wiklander 
188c8abbbdbSVolodymyr Babchuk #ifdef ASM
189c8abbbdbSVolodymyr Babchuk #define UINTPTR_C(v) v
190c8abbbdbSVolodymyr Babchuk #else
191c8abbbdbSVolodymyr Babchuk #define UINTPTR_C(v) v ## LU
192c8abbbdbSVolodymyr Babchuk #endif
193c8abbbdbSVolodymyr Babchuk 
1944c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */
1954c1908d3SJens Wiklander 
1964c1908d3SJens Wiklander #define INTMAX_C(v)	INT64_C(v)
1974c1908d3SJens Wiklander #define UINTMAX_C(v)	UINT64_C(v)
1984c1908d3SJens Wiklander 
1994c1908d3SJens Wiklander 
200b0104773SPascal Brand #endif /* STDINT_H */
201