1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
3 * ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
16 * The Original Code is Mozilla Communicator client code, released
19 * The Initial Developer of the Original Code is
20 * Netscape Communications Corporation.
21 * Portions created by the Initial Developer are Copyright (C) 1998
22 * the Initial Developer. All Rights Reserved.
25 * Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
27 * Alternatively, the contents of this file may be used under the terms of
28 * either of the GNU General Public License Version 2 or later (the "GPL"),
29 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30 * in which case the provisions of the GPL or the LGPL are applicable instead
31 * of those above. If you wish to allow use of your version of this file only
32 * under the terms of either the GPL or the LGPL, and not to allow others to
33 * use your version of this file under the terms of the MPL, indicate your
34 * decision by deleting the provisions above and replace them with the notice
35 * and other provisions required by the GPL or the LGPL. If you do not delete
36 * the provisions above, a recipient may use your version of this file under
37 * the terms of any one of the MPL, the GPL or the LGPL.
39 * ***** END LICENSE BLOCK ***** */
42 * Generate CPU-specific bit-size and similar #defines.
52 /************************************************************************/
54 /* Generate cpucfg.h */
56 #if defined(XP_WIN) || defined(XP_OS2)
59 #define INT64 long long
67 #if defined(HPUX) || defined(__QNX__)
70 #define INT64 long long
74 #endif /* CROSS_COMPILE */
77 #define NS_NEVER_INLINE __attribute__((noinline))
79 #define NS_NEVER_INLINE
83 static int StackGrowthDirection(int *dummy1addr
);
84 #pragma no_inline(StackGrowthDirection)
105 struct align_fakelonglong
{
115 struct align_double
{
119 struct align_pointer
{
123 struct align_prword
{
128 #define ALIGN_OF(type) \
129 (((char*)&(((struct align_##type *)0)->a)) - ((char*)0))
133 static int Log2(unsigned int n
)
140 log2
+= 16, n
>>= 16;
153 * Conceivably this could actually be used, but there is lots of code out
154 * there with ands and shifts in it that assumes a byte is exactly 8 bits,
155 * so forget about porting THIS code to all those non 8 bit byte machines.
157 static void BitsPerByte(void)
162 static int NS_NEVER_INLINE
StackGrowthDirection(int *dummy1addr
)
166 return (&dummy2
< dummy1addr
) ? -1 : 1;
169 int main(int argc
, char **argv
)
171 int sizeof_char
, sizeof_short
, sizeof_int
, sizeof_int64
, sizeof_long
,
172 sizeof_float
, sizeof_double
, sizeof_word
, sizeof_dword
;
173 int bits_per_int64_log2
, align_of_short
, align_of_int
, align_of_long
,
174 align_of_int64
, align_of_float
, align_of_double
, align_of_pointer
,
180 printf("#ifndef js_cpucfg___\n");
181 printf("#define js_cpucfg___\n\n");
183 printf("/* AUTOMATICALLY GENERATED - DO NOT EDIT */\n\n");
186 #if defined(__APPLE__)
188 * Darwin NSPR uses the same MDCPUCFG (_darwin.cfg) for multiple
189 * processors, and determines which processor to configure for based
190 * on compiler predefined macros. We do the same thing here.
192 printf("#ifdef __LITTLE_ENDIAN__\n");
193 printf("#define IS_LITTLE_ENDIAN 1\n");
194 printf("#undef IS_BIG_ENDIAN\n");
196 printf("#undef IS_LITTLE_ENDIAN\n");
197 printf("#define IS_BIG_ENDIAN 1\n");
198 printf("#endif\n\n");
199 #elif defined(IS_LITTLE_ENDIAN)
200 printf("#define IS_LITTLE_ENDIAN 1\n");
201 printf("#undef IS_BIG_ENDIAN\n\n");
202 #elif defined(IS_BIG_ENDIAN)
203 printf("#undef IS_LITTLE_ENDIAN\n");
204 printf("#define IS_BIG_ENDIAN 1\n\n");
206 #error "Endianess not defined."
209 sizeof_char
= PR_BYTES_PER_BYTE
;
210 sizeof_short
= PR_BYTES_PER_SHORT
;
211 sizeof_int
= PR_BYTES_PER_INT
;
212 sizeof_int64
= PR_BYTES_PER_INT64
;
213 sizeof_long
= PR_BYTES_PER_LONG
;
214 sizeof_float
= PR_BYTES_PER_FLOAT
;
215 sizeof_double
= PR_BYTES_PER_DOUBLE
;
216 sizeof_word
= PR_BYTES_PER_WORD
;
217 sizeof_dword
= PR_BYTES_PER_DWORD
;
219 bits_per_int64_log2
= PR_BITS_PER_INT64_LOG2
;
221 align_of_short
= PR_ALIGN_OF_SHORT
;
222 align_of_int
= PR_ALIGN_OF_INT
;
223 align_of_long
= PR_ALIGN_OF_LONG
;
224 align_of_int64
= PR_ALIGN_OF_INT64
;
225 align_of_float
= PR_ALIGN_OF_FLOAT
;
226 align_of_double
= PR_ALIGN_OF_DOUBLE
;
227 align_of_pointer
= PR_ALIGN_OF_POINTER
;
228 align_of_word
= PR_ALIGN_OF_WORD
;
230 #else /* !CROSS_COMPILE */
233 * We don't handle PDP-endian or similar orders: if a short is big-endian,
234 * so must int and long be big-endian for us to generate the IS_BIG_ENDIAN
235 * #define and the IS_LITTLE_ENDIAN #undef.
238 int big_endian
= 0, little_endian
= 0, ntests
= 0;
240 if (sizeof(short) == 2) {
241 /* force |volatile| here to get rid of any compiler optimisations
242 * (var in register etc.) which may be appiled to |auto| vars -
243 * even those in |union|s...
244 * (|static| is used to get the same functionality for compilers
245 * which do not honor |volatile|...).
247 volatile static union {
253 big_endian
+= (u
.c
[0] == 0x01 && u
.c
[1] == 0x02);
254 little_endian
+= (u
.c
[0] == 0x02 && u
.c
[1] == 0x01);
258 if (sizeof(int) == 4) {
259 /* force |volatile| here ... */
260 volatile static union {
266 big_endian
+= (u
.c
[0] == 0x01 && u
.c
[1] == 0x02 &&
267 u
.c
[2] == 0x03 && u
.c
[3] == 0x04);
268 little_endian
+= (u
.c
[0] == 0x04 && u
.c
[1] == 0x03 &&
269 u
.c
[2] == 0x02 && u
.c
[3] == 0x01);
273 if (sizeof(long) == 8) {
274 /* force |volatile| here ... */
275 volatile static union {
281 * Write this as portably as possible: avoid 0x0102030405060708L
285 u
.i
<<= 16, u
.i
<<= 16;
287 big_endian
+= (u
.c
[0] == 0x01 && u
.c
[1] == 0x02 &&
288 u
.c
[2] == 0x03 && u
.c
[3] == 0x04 &&
289 u
.c
[4] == 0x05 && u
.c
[5] == 0x06 &&
290 u
.c
[6] == 0x07 && u
.c
[7] == 0x08);
291 little_endian
+= (u
.c
[0] == 0x08 && u
.c
[1] == 0x07 &&
292 u
.c
[2] == 0x06 && u
.c
[3] == 0x05 &&
293 u
.c
[4] == 0x04 && u
.c
[5] == 0x03 &&
294 u
.c
[6] == 0x02 && u
.c
[7] == 0x01);
298 if (big_endian
&& big_endian
== ntests
) {
299 printf("#undef IS_LITTLE_ENDIAN\n");
300 printf("#define IS_BIG_ENDIAN 1\n\n");
301 } else if (little_endian
&& little_endian
== ntests
) {
302 printf("#define IS_LITTLE_ENDIAN 1\n");
303 printf("#undef IS_BIG_ENDIAN\n\n");
305 fprintf(stderr
, "%s: unknown byte order"
306 "(big_endian=%d, little_endian=%d, ntests=%d)!\n",
307 argv
[0], big_endian
, little_endian
, ntests
);
312 sizeof_char
= sizeof(char);
313 sizeof_short
= sizeof(short);
314 sizeof_int
= sizeof(int);
316 sizeof_long
= sizeof(long);
317 sizeof_float
= sizeof(float);
318 sizeof_double
= sizeof(double);
319 sizeof_word
= sizeof(prword
);
322 bits_per_int64_log2
= 6;
324 align_of_short
= ALIGN_OF(short);
325 align_of_int
= ALIGN_OF(int);
326 align_of_long
= ALIGN_OF(long);
327 if (sizeof(INT64
) < 8) {
328 /* this machine doesn't actually support int64's */
329 align_of_int64
= ALIGN_OF(fakelonglong
);
331 align_of_int64
= ALIGN_OF(int64
);
333 align_of_float
= ALIGN_OF(float);
334 align_of_double
= ALIGN_OF(double);
335 align_of_pointer
= ALIGN_OF(pointer
);
336 align_of_word
= ALIGN_OF(prword
);
338 #endif /* CROSS_COMPILE */
340 printf("#define JS_BYTES_PER_BYTE %dL\n", sizeof_char
);
341 printf("#define JS_BYTES_PER_SHORT %dL\n", sizeof_short
);
342 printf("#define JS_BYTES_PER_INT %dL\n", sizeof_int
);
343 printf("#define JS_BYTES_PER_INT64 %dL\n", sizeof_int64
);
344 printf("#define JS_BYTES_PER_LONG %dL\n", sizeof_long
);
345 printf("#define JS_BYTES_PER_FLOAT %dL\n", sizeof_float
);
346 printf("#define JS_BYTES_PER_DOUBLE %dL\n", sizeof_double
);
347 printf("#define JS_BYTES_PER_WORD %dL\n", sizeof_word
);
348 printf("#define JS_BYTES_PER_DWORD %dL\n", sizeof_dword
);
351 printf("#define JS_BITS_PER_BYTE %dL\n", bpb
);
352 printf("#define JS_BITS_PER_SHORT %dL\n", bpb
* sizeof_short
);
353 printf("#define JS_BITS_PER_INT %dL\n", bpb
* sizeof_int
);
354 printf("#define JS_BITS_PER_INT64 %dL\n", bpb
* sizeof_int64
);
355 printf("#define JS_BITS_PER_LONG %dL\n", bpb
* sizeof_long
);
356 printf("#define JS_BITS_PER_FLOAT %dL\n", bpb
* sizeof_float
);
357 printf("#define JS_BITS_PER_DOUBLE %dL\n", bpb
* sizeof_double
);
358 printf("#define JS_BITS_PER_WORD %dL\n", bpb
* sizeof_word
);
361 printf("#define JS_BITS_PER_BYTE_LOG2 %dL\n", Log2(bpb
));
362 printf("#define JS_BITS_PER_SHORT_LOG2 %dL\n", Log2(bpb
* sizeof_short
));
363 printf("#define JS_BITS_PER_INT_LOG2 %dL\n", Log2(bpb
* sizeof_int
));
364 printf("#define JS_BITS_PER_INT64_LOG2 %dL\n", bits_per_int64_log2
);
365 printf("#define JS_BITS_PER_LONG_LOG2 %dL\n", Log2(bpb
* sizeof_long
));
366 printf("#define JS_BITS_PER_FLOAT_LOG2 %dL\n", Log2(bpb
* sizeof_float
));
367 printf("#define JS_BITS_PER_DOUBLE_LOG2 %dL\n", Log2(bpb
* sizeof_double
));
368 printf("#define JS_BITS_PER_WORD_LOG2 %dL\n", Log2(bpb
* sizeof_word
));
371 printf("#define JS_ALIGN_OF_SHORT %dL\n", align_of_short
);
372 printf("#define JS_ALIGN_OF_INT %dL\n", align_of_int
);
373 printf("#define JS_ALIGN_OF_LONG %dL\n", align_of_long
);
374 printf("#define JS_ALIGN_OF_INT64 %dL\n", align_of_int64
);
375 printf("#define JS_ALIGN_OF_FLOAT %dL\n", align_of_float
);
376 printf("#define JS_ALIGN_OF_DOUBLE %dL\n", align_of_double
);
377 printf("#define JS_ALIGN_OF_POINTER %dL\n", align_of_pointer
);
378 printf("#define JS_ALIGN_OF_WORD %dL\n", align_of_word
);
381 printf("#define JS_BYTES_PER_WORD_LOG2 %dL\n", Log2(sizeof_word
));
382 printf("#define JS_BYTES_PER_DWORD_LOG2 %dL\n", Log2(sizeof_dword
));
383 printf("#define JS_WORDS_PER_DWORD_LOG2 %dL\n", Log2(sizeof_dword
/sizeof_word
));
386 printf("#define JS_STACK_GROWTH_DIRECTION (%d)\n", StackGrowthDirection(&dummy1
));
389 printf("#define JS_HAVE_LONG_LONG\n");
392 #if defined __GNUC__ && defined __x86_64__
393 printf("#define HAVE_VA_LIST_AS_ARRAY 1\n");
397 printf("#endif /* js_cpucfg___ */\n");