xref: /optee_os/lib/libutils/isoc/include/stdint.h (revision 7eaed3a3dfb33730c118d0b4f9155e53ca16af17)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2b0104773SPascal Brand /*
3b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
4b0104773SPascal Brand  */
5b0104773SPascal Brand 
69668cb1eSJens Wiklander #include <limits.h>
79668cb1eSJens 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 
13*7eaed3a3SEtienne Carriere #ifndef __STDINT_H
14*7eaed3a3SEtienne Carriere #define __STDINT_H
15b0104773SPascal Brand 
161f60363aSJens Wiklander /*
171f60363aSJens Wiklander  * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out
181f60363aSJens Wiklander  * here.
191f60363aSJens Wiklander  */
201f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
211f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \
221f60363aSJens Wiklander 	defined(__SIZEOF_LONG__)
231f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4
241f60363aSJens Wiklander #define __ILP32__ 1
251f60363aSJens Wiklander #endif
261f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8
271f60363aSJens Wiklander #define __LP64__ 1
281f60363aSJens Wiklander #endif
291f60363aSJens Wiklander #endif
301f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */
311f60363aSJens Wiklander 
321f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
331f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined
341f60363aSJens Wiklander #endif
351f60363aSJens Wiklander 
36757331fcSJens Wiklander #ifndef __ASSEMBLER__
37385e3901SJens Wiklander 
38b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */
39b0104773SPascal Brand #ifndef __int8_t_defined
40b0104773SPascal Brand # define __int8_t_defined
41b0104773SPascal Brand typedef signed char             int8_t;
42b0104773SPascal Brand typedef short int               int16_t;
43b0104773SPascal Brand typedef int                     int32_t;
441f60363aSJens Wiklander #ifdef __ILP32__
45b0104773SPascal Brand __extension__
46b0104773SPascal Brand typedef long long int           int64_t;
471f60363aSJens Wiklander #endif /*__ILP32__*/
481f60363aSJens Wiklander #ifdef __LP64__
491f60363aSJens Wiklander typedef long int		int64_t;
501f60363aSJens Wiklander #endif /*__LP64__*/
51b0104773SPascal Brand #endif
52b0104773SPascal Brand 
53b0104773SPascal Brand /* Unsigned.  */
54b0104773SPascal Brand typedef unsigned char           uint8_t;
55b0104773SPascal Brand typedef unsigned short int      uint16_t;
56b0104773SPascal Brand #ifndef __uint32_t_defined
57b0104773SPascal Brand typedef unsigned int            uint32_t;
58b0104773SPascal Brand # define __uint32_t_defined
59b0104773SPascal Brand #endif
601f60363aSJens Wiklander #ifdef __ILP32__
61b0104773SPascal Brand __extension__
62b0104773SPascal Brand typedef unsigned long long int  uint64_t;
631f60363aSJens Wiklander #endif /*__ILP32__*/
641f60363aSJens Wiklander #ifdef __LP64__
651f60363aSJens Wiklander typedef unsigned long int	uint64_t;
661f60363aSJens Wiklander #endif /*__LP64__*/
67b0104773SPascal Brand 
684c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */
694c1908d3SJens Wiklander typedef int8_t int_least8_t;
704c1908d3SJens Wiklander typedef int16_t int_least16_t;
714c1908d3SJens Wiklander typedef int32_t int_least32_t;
724c1908d3SJens Wiklander typedef int64_t int_least64_t;
734c1908d3SJens Wiklander typedef uint8_t uint_least8_t;
744c1908d3SJens Wiklander typedef uint16_t uint_least16_t;
754c1908d3SJens Wiklander typedef uint32_t uint_least32_t;
764c1908d3SJens Wiklander typedef uint64_t uint_least64_t;
774c1908d3SJens Wiklander 
784c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */
794c1908d3SJens Wiklander typedef int8_t int_fast8_t;
804c1908d3SJens Wiklander typedef int16_t int_fast16_t;
814c1908d3SJens Wiklander typedef int32_t int_fast32_t;
824c1908d3SJens Wiklander typedef int64_t int_fast64_t;
834c1908d3SJens Wiklander typedef uint8_t uint_fast8_t;
844c1908d3SJens Wiklander typedef uint16_t uint_fast16_t;
854c1908d3SJens Wiklander typedef uint32_t uint_fast32_t;
864c1908d3SJens Wiklander typedef uint64_t uint_fast64_t;
874c1908d3SJens Wiklander 
88b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */
891f60363aSJens Wiklander typedef long intptr_t;
901f60363aSJens Wiklander typedef unsigned long uintptr_t;
91b0104773SPascal Brand 
921f60363aSJens Wiklander typedef int64_t intmax_t;
931f60363aSJens Wiklander typedef uint64_t uintmax_t;
94b0104773SPascal Brand 
95757331fcSJens Wiklander #endif /*__ASSEMBLER__*/
96385e3901SJens Wiklander 
97b0104773SPascal Brand /*
98b0104773SPascal Brand  * 7.18.2 Limits of specified-width integer types
99b0104773SPascal Brand  */
100b0104773SPascal Brand 
101b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */
102b0104773SPascal Brand 
103b0104773SPascal Brand #define INT8_MIN    (-0x7f-1)
104b0104773SPascal Brand #define INT16_MIN   (-0x7fff-1)
105b0104773SPascal Brand #define INT32_MIN   (-0x7fffffff-1)
106b0104773SPascal Brand #define INT64_MIN   (-0x7fffffffffffffffL-1)
107b0104773SPascal Brand 
108b0104773SPascal Brand #define INT8_MAX    0x7f
109b0104773SPascal Brand #define INT16_MAX   0x7fff
110b0104773SPascal Brand #define INT32_MAX   0x7fffffff
111b0104773SPascal Brand #define INT64_MAX   0x7fffffffffffffffL
112b0104773SPascal Brand 
113b0104773SPascal Brand #define UINT8_MAX    0xff
114b0104773SPascal Brand #define UINT16_MAX   0xffff
115b0104773SPascal Brand #define UINT32_MAX   0xffffffffU
116b0104773SPascal Brand #define UINT64_MAX   0xffffffffffffffffUL
117b0104773SPascal Brand 
1184c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */
1194c1908d3SJens Wiklander 
1204c1908d3SJens Wiklander #define INT_LEAST8_MIN		INT8_MIN
1214c1908d3SJens Wiklander #define INT_LEAST16_MIN		INT16_MIN
1224c1908d3SJens Wiklander #define INT_LEAST32_MIN		INT32_MIN
1234c1908d3SJens Wiklander #define INT_LEAST64_MIN		INT64_MIN
1244c1908d3SJens Wiklander 
1254c1908d3SJens Wiklander #define INT_LEAST8_MAX		INT8_MAX
1264c1908d3SJens Wiklander #define INT_LEAST16_MAX		INT16_MAX
1274c1908d3SJens Wiklander #define INT_LEAST32_MAX		INT32_MAX
1284c1908d3SJens Wiklander #define INT_LEAST64_MAX		INT64_MAX
1294c1908d3SJens Wiklander 
1304c1908d3SJens Wiklander #define UINT_LEAST8_MAX		UINT8_MAX
1314c1908d3SJens Wiklander #define UINT_LEAST16_MAX	UINT16_MAX
1324c1908d3SJens Wiklander #define UINT_LEAST32_MAX	UINT32_MAX
1334c1908d3SJens Wiklander #define UINT_LEAST64_MAX	UINT64_MAX
1344c1908d3SJens Wiklander 
1354c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */
1364c1908d3SJens Wiklander 
1374c1908d3SJens Wiklander #define INT_FAST8_MIN		INT8_MIN
1384c1908d3SJens Wiklander #define INT_FAST16_MIN		INT16_MIN
1394c1908d3SJens Wiklander #define INT_FAST32_MIN		INT32_MIN
1404c1908d3SJens Wiklander #define INT_FAST64_MIN		INT64_MIN
1414c1908d3SJens Wiklander 
1424c1908d3SJens Wiklander #define INT_FAST8_MAX		INT8_MAX
1434c1908d3SJens Wiklander #define INT_FAST16_MAX		INT16_MAX
1444c1908d3SJens Wiklander #define INT_FAST32_MAX		INT32_MAX
1454c1908d3SJens Wiklander #define INT_FAST64_MAX		INT64_MAX
1464c1908d3SJens Wiklander 
1474c1908d3SJens Wiklander #define UINT_FAST8_MAX		UINT8_MAX
1484c1908d3SJens Wiklander #define UINT_FAST16_MAX		UINT16_MAX
1494c1908d3SJens Wiklander #define UINT_FAST32_MAX		UINT32_MAX
1504c1908d3SJens Wiklander #define UINT_FAST64_MAX		UINT64_MAX
1514c1908d3SJens Wiklander 
152b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */
153b0104773SPascal Brand 
1541f60363aSJens Wiklander #define INTPTR_MIN  LONG_MIN
1551f60363aSJens Wiklander #define INTPTR_MAX  LONG_MAX
1561f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX
1571f60363aSJens Wiklander 
15839a6336dSJason Lin /* 7.18.2.5  Limits of greatest-width integer types */
1591f60363aSJens Wiklander #define INTMAX_MAX  INT64_MAX
1601f60363aSJens Wiklander #define INTMAX_MIN  INT64_MIN
1611f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX
162b0104773SPascal Brand 
16339a6336dSJason Lin /* 7.18.3  Limits of other integer types */
16439a6336dSJason Lin #define SIZE_MAX	ULONG_MAX
16539a6336dSJason Lin 
1664c1908d3SJens Wiklander /*
1674c1908d3SJens Wiklander  * 7.18.4 Macros for integer constants
1684c1908d3SJens Wiklander  */
1694c1908d3SJens Wiklander 
170378e007dSJens Wiklander #ifdef __ASSEMBLER__
171378e007dSJens Wiklander #define U(v)		v
172378e007dSJens Wiklander #define UL(v)		v
173378e007dSJens Wiklander #define ULL(v)		v
174378e007dSJens Wiklander #define L(v)		v
175378e007dSJens Wiklander #define LL(v)		v
176378e007dSJens Wiklander #else
177378e007dSJens Wiklander #define U(v)		v ## U
178378e007dSJens Wiklander #define UL(v)		v ## UL
179378e007dSJens Wiklander #define ULL(v)		v ## ULL
180378e007dSJens Wiklander #define L(v)		v ## L
181378e007dSJens Wiklander #define LL(v)		v ## LL
182378e007dSJens Wiklander #endif
183378e007dSJens Wiklander 
1844c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */
1854c1908d3SJens Wiklander 
1864c1908d3SJens Wiklander #define INT8_C(v)	v
1874c1908d3SJens Wiklander #define UINT8_C(v)	v
1884c1908d3SJens Wiklander #define INT16_C(v)	v
1894c1908d3SJens Wiklander #define UINT16_C(v)	v
1904c1908d3SJens Wiklander #define INT32_C(v)	v
191378e007dSJens Wiklander #define UINT32_C(v)	U(v)
1924c1908d3SJens Wiklander #ifdef __ILP32__
193378e007dSJens Wiklander #define INT64_C(v)	LL(v)
194378e007dSJens Wiklander #define UINT64_C(v)	ULL(v)
1954c1908d3SJens Wiklander #endif
1964c1908d3SJens Wiklander #ifdef __LP64__
197378e007dSJens Wiklander #define INT64_C(v)	L(v)
198378e007dSJens Wiklander #define UINT64_C(v)	UL(v)
1994c1908d3SJens Wiklander #endif
2004c1908d3SJens Wiklander 
201378e007dSJens Wiklander #define UINTPTR_C(v)	UL(v)
202c8abbbdbSVolodymyr Babchuk 
2034c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */
2044c1908d3SJens Wiklander 
2054c1908d3SJens Wiklander #define INTMAX_C(v)	INT64_C(v)
2064c1908d3SJens Wiklander #define UINTMAX_C(v)	UINT64_C(v)
2074c1908d3SJens Wiklander 
208*7eaed3a3SEtienne Carriere #endif /* __STDINT_H */
209