* hwint.c (define HOST_WIDE_INT_PRINT_DEC_C): New define.
[official-gcc.git] / gcc / hwint.h
blob9589c321a78bb2da11be1943a92a27b2536a6f2c
1 /* HOST_WIDE_INT definitions for the GNU compiler.
2 Copyright (C) 1998 Free Software Foundation, Inc.
4 This file is part of GCC.
6 Provide definitions for macros which depend on HOST_BITS_PER_INT
7 and HOST_BITS_PER_LONG. */
9 #ifndef GCC_HWINT_H
10 #define GCC_HWINT_H
12 /* This describes the machine the compiler is hosted on. */
13 #define HOST_BITS_PER_CHAR CHAR_BIT
14 #define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
15 #define HOST_BITS_PER_INT (CHAR_BIT * SIZEOF_INT)
16 #define HOST_BITS_PER_LONG (CHAR_BIT * SIZEOF_LONG)
18 #ifdef HAVE_LONG_LONG
19 # define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
20 #else
21 #ifdef HAVE__INT64
22 # define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF___INT64)
23 #else
24 /* If we're here and we're GCC, assume this is stage 2+ of a bootstrap
25 and 'long long' has the width of the *target*'s long long. */
26 # if GCC_VERSION > 3000
27 # define HOST_BITS_PER_LONGLONG LONG_LONG_TYPE_SIZE
28 # endif /* gcc */
29 #endif
30 #endif /* no long long */
32 /* Find the largest host integer type and set its size and type. */
34 /* Use long long on the host if the target has a wider long type than
35 the host. */
37 #if ! defined HOST_BITS_PER_WIDE_INT \
38 && defined HOST_BITS_PER_LONGLONG \
39 && (HOST_BITS_PER_LONGLONG > HOST_BITS_PER_LONG) \
40 && (defined (LONG_LONG_MAX) || defined (LONGLONG_MAX) \
41 || defined (LLONG_MAX) || defined (__GNUC__))
43 # ifdef MAX_LONG_TYPE_SIZE
44 # if MAX_LONG_TYPE_SIZE > HOST_BITS_PER_LONG
45 # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONGLONG
46 # define HOST_WIDE_INT long long
47 # endif
48 # else
49 # if LONG_TYPE_SIZE > HOST_BITS_PER_LONG
50 # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONGLONG
51 # define HOST_WIDE_INT long long
52 # endif
53 # endif
55 #endif
57 #ifndef HOST_BITS_PER_WIDE_INT
59 # if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
60 # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
61 # define HOST_WIDE_INT long
62 # else
63 # define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
64 # define HOST_WIDE_INT int
65 # endif
67 #endif /* ! HOST_BITS_PER_WIDE_INT */
69 /* Provide defaults for the way to print a HOST_WIDE_INT
70 in various manners. */
72 #ifndef HOST_WIDE_INT_PRINT_DEC
73 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
74 # define HOST_WIDE_INT_PRINT_DEC "%d"
75 # define HOST_WIDE_INT_PRINT_DEC_C "%d"
76 # else
77 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
78 # define HOST_WIDE_INT_PRINT_DEC "%ld"
79 # define HOST_WIDE_INT_PRINT_DEC_C "%ldL"
80 # else
81 # define HOST_WIDE_INT_PRINT_DEC "%lld"
82 # define HOST_WIDE_INT_PRINT_DEC_C "%lldLL"
83 # endif
84 # endif
85 #endif /* ! HOST_WIDE_INT_PRINT_DEC */
87 #ifndef HOST_WIDE_INT_PRINT_UNSIGNED
88 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
89 # define HOST_WIDE_INT_PRINT_UNSIGNED "%u"
90 # else
91 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
92 # define HOST_WIDE_INT_PRINT_UNSIGNED "%lu"
93 # else
94 # define HOST_WIDE_INT_PRINT_UNSIGNED "%llu"
95 # endif
96 # endif
97 #endif /* ! HOST_WIDE_INT_PRINT_UNSIGNED */
99 #ifndef HOST_WIDE_INT_PRINT_HEX
100 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
101 # define HOST_WIDE_INT_PRINT_HEX "0x%x"
102 # else
103 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
104 # define HOST_WIDE_INT_PRINT_HEX "0x%lx"
105 # else
106 # define HOST_WIDE_INT_PRINT_HEX "0x%llx"
107 # endif
108 # endif
109 #endif /* ! HOST_WIDE_INT_PRINT_HEX */
111 #ifndef HOST_WIDE_INT_PRINT_DOUBLE_HEX
112 # if HOST_BITS_PER_WIDE_INT == 64
113 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
114 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%x%016x"
115 # else
116 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
117 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%016lx"
118 # else
119 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%016llx"
120 # endif
121 # endif
122 # else
123 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
124 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%x%08x"
125 # else
126 # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
127 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%08lx"
128 # else
129 # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%08llx"
130 # endif
131 # endif
132 # endif
133 #endif /* ! HOST_WIDE_INT_PRINT_DOUBLE_HEX */
135 /* Find HOST_WIDEST_INT and set its bit size, type and print macros.
136 It will be the largest integer mode supported by the host which may
137 (or may not) be larger than HOST_WIDE_INT. */
139 #ifndef HOST_WIDEST_INT
140 #if defined HOST_BITS_PER_LONGLONG \
141 && HOST_BITS_PER_LONGLONG > HOST_BITS_PER_LONG
142 # define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONGLONG
143 # define HOST_WIDEST_INT long long
144 # define HOST_WIDEST_INT_PRINT_DEC "%lld"
145 # define HOST_WIDEST_INT_PRINT_UNSIGNED "%llu"
146 # define HOST_WIDEST_INT_PRINT_HEX "0x%llx"
147 # else
148 # define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONG
149 # define HOST_WIDEST_INT long
150 # define HOST_WIDEST_INT_PRINT_DEC "%ld"
151 # define HOST_WIDEST_INT_PRINT_UNSIGNED "%lu"
152 # define HOST_WIDEST_INT_PRINT_HEX "0x%lx"
153 # endif /* long long wider than long */
154 #endif /* ! HOST_WIDEST_INT */
156 #endif /* ! GCC_HWINT_H */