xref: /optee_os/lib/libutils/isoc/include/stdint.h (revision 385e3901a6f10bc2bb000fa283909db3bdbd9809)
1b0104773SPascal Brand /*
2b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
3b0104773SPascal Brand  * All rights reserved.
4b0104773SPascal Brand  *
5b0104773SPascal Brand  * Redistribution and use in source and binary forms, with or without
6b0104773SPascal Brand  * modification, are permitted provided that the following conditions are met:
7b0104773SPascal Brand  *
8b0104773SPascal Brand  * 1. Redistributions of source code must retain the above copyright notice,
9b0104773SPascal Brand  * this list of conditions and the following disclaimer.
10b0104773SPascal Brand  *
11b0104773SPascal Brand  * 2. Redistributions in binary form must reproduce the above copyright notice,
12b0104773SPascal Brand  * this list of conditions and the following disclaimer in the documentation
13b0104773SPascal Brand  * and/or other materials provided with the distribution.
14b0104773SPascal Brand  *
15b0104773SPascal Brand  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16b0104773SPascal Brand  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17b0104773SPascal Brand  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18b0104773SPascal Brand  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19b0104773SPascal Brand  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20b0104773SPascal Brand  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21b0104773SPascal Brand  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22b0104773SPascal Brand  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23b0104773SPascal Brand  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24b0104773SPascal Brand  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25b0104773SPascal Brand  * POSSIBILITY OF SUCH DAMAGE.
26b0104773SPascal Brand  */
27b0104773SPascal Brand 
28b0104773SPascal Brand /*
29b0104773SPascal Brand  * This file provides what C99 standard requires in
30b0104773SPascal Brand  * 7.18 interger types <stdint.h>
31b0104773SPascal Brand  */
32b0104773SPascal Brand 
33b0104773SPascal Brand #ifndef STDINT_H
34b0104773SPascal Brand #define STDINT_H
35b0104773SPascal Brand #define _STDINT_H
36b0104773SPascal Brand 
371f60363aSJens Wiklander /*
381f60363aSJens Wiklander  * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out
391f60363aSJens Wiklander  * here.
401f60363aSJens Wiklander  */
411f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
421f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \
431f60363aSJens Wiklander 	defined(__SIZEOF_LONG__)
441f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4
451f60363aSJens Wiklander #define __ILP32__ 1
461f60363aSJens Wiklander #endif
471f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8
481f60363aSJens Wiklander #define __LP64__ 1
491f60363aSJens Wiklander #endif
501f60363aSJens Wiklander #endif
511f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */
521f60363aSJens Wiklander 
531f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
541f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined
551f60363aSJens Wiklander #endif
561f60363aSJens Wiklander 
57*385e3901SJens Wiklander #ifndef ASM
58*385e3901SJens Wiklander 
59b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */
60b0104773SPascal Brand #ifndef __int8_t_defined
61b0104773SPascal Brand # define __int8_t_defined
62b0104773SPascal Brand typedef signed char             int8_t;
63b0104773SPascal Brand typedef short int               int16_t;
64b0104773SPascal Brand typedef int                     int32_t;
651f60363aSJens Wiklander #ifdef __ILP32__
66b0104773SPascal Brand __extension__
67b0104773SPascal Brand typedef long long int           int64_t;
681f60363aSJens Wiklander #endif /*__ILP32__*/
691f60363aSJens Wiklander #ifdef __LP64__
701f60363aSJens Wiklander typedef long int		int64_t;
711f60363aSJens Wiklander #endif /*__LP64__*/
72b0104773SPascal Brand #endif
73b0104773SPascal Brand 
74b0104773SPascal Brand /* Unsigned.  */
75b0104773SPascal Brand typedef unsigned char           uint8_t;
76b0104773SPascal Brand typedef unsigned short int      uint16_t;
77b0104773SPascal Brand #ifndef __uint32_t_defined
78b0104773SPascal Brand typedef unsigned int            uint32_t;
79b0104773SPascal Brand # define __uint32_t_defined
80b0104773SPascal Brand #endif
811f60363aSJens Wiklander #ifdef __ILP32__
82b0104773SPascal Brand __extension__
83b0104773SPascal Brand typedef unsigned long long int  uint64_t;
841f60363aSJens Wiklander #endif /*__ILP32__*/
851f60363aSJens Wiklander #ifdef __LP64__
861f60363aSJens Wiklander typedef unsigned long int	uint64_t;
871f60363aSJens Wiklander #endif /*__LP64__*/
88b0104773SPascal Brand 
894c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */
904c1908d3SJens Wiklander typedef int8_t int_least8_t;
914c1908d3SJens Wiklander typedef int16_t int_least16_t;
924c1908d3SJens Wiklander typedef int32_t int_least32_t;
934c1908d3SJens Wiklander typedef int64_t int_least64_t;
944c1908d3SJens Wiklander typedef uint8_t uint_least8_t;
954c1908d3SJens Wiklander typedef uint16_t uint_least16_t;
964c1908d3SJens Wiklander typedef uint32_t uint_least32_t;
974c1908d3SJens Wiklander typedef uint64_t uint_least64_t;
984c1908d3SJens Wiklander 
994c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */
1004c1908d3SJens Wiklander typedef int8_t int_fast8_t;
1014c1908d3SJens Wiklander typedef int16_t int_fast16_t;
1024c1908d3SJens Wiklander typedef int32_t int_fast32_t;
1034c1908d3SJens Wiklander typedef int64_t int_fast64_t;
1044c1908d3SJens Wiklander typedef uint8_t uint_fast8_t;
1054c1908d3SJens Wiklander typedef uint16_t uint_fast16_t;
1064c1908d3SJens Wiklander typedef uint32_t uint_fast32_t;
1074c1908d3SJens Wiklander typedef uint64_t uint_fast64_t;
1084c1908d3SJens Wiklander 
109b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */
1101f60363aSJens Wiklander typedef long intptr_t;
1111f60363aSJens Wiklander typedef unsigned long uintptr_t;
112b0104773SPascal Brand 
1131f60363aSJens Wiklander typedef int64_t intmax_t;
1141f60363aSJens Wiklander typedef uint64_t uintmax_t;
115b0104773SPascal Brand 
116*385e3901SJens Wiklander #endif /*ASM*/
117*385e3901SJens Wiklander 
118b0104773SPascal Brand /*
119b0104773SPascal Brand  * 7.18.2 Limits of specified-width integer types
120b0104773SPascal Brand  */
121b0104773SPascal Brand 
122b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */
123b0104773SPascal Brand 
124b0104773SPascal Brand #define INT8_MIN    (-0x7f-1)
125b0104773SPascal Brand #define INT16_MIN   (-0x7fff-1)
126b0104773SPascal Brand #define INT32_MIN   (-0x7fffffff-1)
127b0104773SPascal Brand #define INT64_MIN   (-0x7fffffffffffffffL-1)
128b0104773SPascal Brand 
129b0104773SPascal Brand #define INT8_MAX    0x7f
130b0104773SPascal Brand #define INT16_MAX   0x7fff
131b0104773SPascal Brand #define INT32_MAX   0x7fffffff
132b0104773SPascal Brand #define INT64_MAX   0x7fffffffffffffffL
133b0104773SPascal Brand 
134b0104773SPascal Brand #define UINT8_MAX    0xff
135b0104773SPascal Brand #define UINT16_MAX   0xffff
136b0104773SPascal Brand #define UINT32_MAX   0xffffffffU
137b0104773SPascal Brand #define UINT64_MAX   0xffffffffffffffffUL
138b0104773SPascal Brand 
1394c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */
1404c1908d3SJens Wiklander 
1414c1908d3SJens Wiklander #define INT_LEAST8_MIN		INT8_MIN
1424c1908d3SJens Wiklander #define INT_LEAST16_MIN		INT16_MIN
1434c1908d3SJens Wiklander #define INT_LEAST32_MIN		INT32_MIN
1444c1908d3SJens Wiklander #define INT_LEAST64_MIN		INT64_MIN
1454c1908d3SJens Wiklander 
1464c1908d3SJens Wiklander #define INT_LEAST8_MAX		INT8_MAX
1474c1908d3SJens Wiklander #define INT_LEAST16_MAX		INT16_MAX
1484c1908d3SJens Wiklander #define INT_LEAST32_MAX		INT32_MAX
1494c1908d3SJens Wiklander #define INT_LEAST64_MAX		INT64_MAX
1504c1908d3SJens Wiklander 
1514c1908d3SJens Wiklander #define UINT_LEAST8_MAX		UINT8_MAX
1524c1908d3SJens Wiklander #define UINT_LEAST16_MAX	UINT16_MAX
1534c1908d3SJens Wiklander #define UINT_LEAST32_MAX	UINT32_MAX
1544c1908d3SJens Wiklander #define UINT_LEAST64_MAX	UINT64_MAX
1554c1908d3SJens Wiklander 
1564c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */
1574c1908d3SJens Wiklander 
1584c1908d3SJens Wiklander #define INT_FAST8_MIN		INT8_MIN
1594c1908d3SJens Wiklander #define INT_FAST16_MIN		INT16_MIN
1604c1908d3SJens Wiklander #define INT_FAST32_MIN		INT32_MIN
1614c1908d3SJens Wiklander #define INT_FAST64_MIN		INT64_MIN
1624c1908d3SJens Wiklander 
1634c1908d3SJens Wiklander #define INT_FAST8_MAX		INT8_MAX
1644c1908d3SJens Wiklander #define INT_FAST16_MAX		INT16_MAX
1654c1908d3SJens Wiklander #define INT_FAST32_MAX		INT32_MAX
1664c1908d3SJens Wiklander #define INT_FAST64_MAX		INT64_MAX
1674c1908d3SJens Wiklander 
1684c1908d3SJens Wiklander #define UINT_FAST8_MAX		UINT8_MAX
1694c1908d3SJens Wiklander #define UINT_FAST16_MAX		UINT16_MAX
1704c1908d3SJens Wiklander #define UINT_FAST32_MAX		UINT32_MAX
1714c1908d3SJens Wiklander #define UINT_FAST64_MAX		UINT64_MAX
1724c1908d3SJens Wiklander 
173b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */
174b0104773SPascal Brand 
1751f60363aSJens Wiklander #define INTPTR_MIN  LONG_MIN
1761f60363aSJens Wiklander #define INTPTR_MAX  LONG_MAX
1771f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX
1781f60363aSJens Wiklander 
17939a6336dSJason Lin /* 7.18.2.5  Limits of greatest-width integer types */
1801f60363aSJens Wiklander #define INTMAX_MAX  INT64_MAX
1811f60363aSJens Wiklander #define INTMAX_MIN  INT64_MIN
1821f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX
183b0104773SPascal Brand 
18439a6336dSJason Lin /* 7.18.3  Limits of other integer types */
18539a6336dSJason Lin #define SIZE_MAX	ULONG_MAX
18639a6336dSJason Lin 
1874c1908d3SJens Wiklander /*
1884c1908d3SJens Wiklander  * 7.18.4 Macros for integer constants
1894c1908d3SJens Wiklander  */
1904c1908d3SJens Wiklander 
1914c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */
1924c1908d3SJens Wiklander 
1934c1908d3SJens Wiklander #define INT8_C(v)	v
1944c1908d3SJens Wiklander #define UINT8_C(v)	v
1954c1908d3SJens Wiklander #define INT16_C(v)	v
1964c1908d3SJens Wiklander #define UINT16_C(v)	v
1974c1908d3SJens Wiklander #define INT32_C(v)	v
1984c1908d3SJens Wiklander #define UINT32_C(v)	v ## U
1994c1908d3SJens Wiklander #ifdef __ILP32__
2004c1908d3SJens Wiklander #define INT64_C(v)	v ## LL
2014c1908d3SJens Wiklander #define UINT64_C(v)	v ## ULL
2024c1908d3SJens Wiklander #endif
2034c1908d3SJens Wiklander #ifdef __LP64__
2044c1908d3SJens Wiklander #define INT64_C(v)	v ## L
2054c1908d3SJens Wiklander #define UINT64_C(v)	v ## UL
2064c1908d3SJens Wiklander #endif
2074c1908d3SJens Wiklander 
2084c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */
2094c1908d3SJens Wiklander 
2104c1908d3SJens Wiklander #define INTMAX_C(v)	INT64_C(v)
2114c1908d3SJens Wiklander #define UINTMAX_C(v)	UINT64_C(v)
2124c1908d3SJens Wiklander 
2134c1908d3SJens Wiklander 
214b0104773SPascal Brand #endif /* STDINT_H */
215