OpenMoHAA 0.83.0
Loading...
Searching...
No Matches
q_platform.h
1/*
2===========================================================================
3Copyright (C) 1999-2005 Id Software, Inc.
4
5This file is part of Quake III Arena source code.
6
7Quake III Arena source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12Quake III Arena source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with Quake III Arena source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23#ifndef __Q_PLATFORM_H
24#define __Q_PLATFORM_H
25
26// this is for determining if we have an asm version of a C function
27#define idx64 0
28#define C_ONLY
29
30#ifdef Q3_VM
31
32#define id386 0
33#define idppc 0
34#define idppc_altivec 0
35#define idsparc 0
36
37#else
38
39#if (defined _M_IX86 || defined __i386__) && !defined(C_ONLY)
40#define id386 1
41#else
42#define id386 0
43#endif
44
45#if (defined(powerc) || defined(powerpc) || defined(ppc) || \
46 defined(__ppc) || defined(__ppc__)) && !defined(C_ONLY)
47#define idppc 1
48#if defined(__VEC__)
49#define idppc_altivec 1
50#ifdef __APPLE__ // Apple's GCC does this differently than the FSF.
51#define VECCONST_UINT8(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
52 (vector unsigned char) (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
53#else
54#define VECCONST_UINT8(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
55 (vector unsigned char) {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}
56#endif
57#else
58#define idppc_altivec 0
59#endif
60#else
61#define idppc 0
62#define idppc_altivec 0
63#endif
64
65#if defined(__sparc__) && !defined(C_ONLY)
66#define idsparc 1
67#else
68#define idsparc 0
69#endif
70
71#endif
72
73// for windows fastcall option
74#define QDECL
75#define QCALL
76
77#define MAC_STATIC
78
79//================================================================= WIN64/32 ===
80
81#if defined(_DEBUG)
82#define DLL_SUFFIX "-dbg"
83#else
84#define DLL_SUFFIX
85#endif
86
87#if defined(TARGET_LOCAL_SYSTEM)
88# define ARCH_SUFFIX
89#elif defined(TARGET_MULTIPLE_ARCHITECTURES)
90// Targeting multiple architecture in a single binary.
91// For example, OSX supports compiling multiple architectures in a single binary
92# define ARCH_SUFFIX ".multiarch"
93#else
94# define ARCH_SUFFIX "." ARCH_STRING
95#endif
96
97// alloca
98#ifdef _MSC_VER
99# include <malloc.h>
100#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
101# include <stdlib.h>
102#else
103# include <alloca.h>
104#endif
105
106#if defined(_WIN64) || defined(__WIN64__)
107
108#undef idx64
109#define idx64 1
110
111#undef QDECL
112#define QDECL __cdecl
113
114#undef QCALL
115#define QCALL __stdcall
116
117#if defined( _MSC_VER )
118#define OS_STRING "win_msvc64"
119#elif defined __MINGW64__
120#define OS_STRING "win_mingw64"
121#endif
122
123#define ID_INLINE __inline
124#define PATH_SEP '\\'
125
126#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
127# define ARCH_STRING "x86_64"
128#elif defined(__aarch64__) || defined(__ARM64__) || defined (_M_ARM64)
129# define ARCH_STRING "arm64"
130#elif defined _M_ALPHA
131# define ARCH_STRING "AXP"
132#endif
133
134#define Q3_LITTLE_ENDIAN
135
136#define DLL_EXT ".dll"
137#define EXE_EXT ".exe"
138
139#elif defined(_WIN32) || defined(__WIN32__)
140
141#undef QDECL
142#define QDECL __cdecl
143
144#undef QCALL
145#define QCALL __stdcall
146
147#if defined( _MSC_VER )
148#define OS_STRING "win_msvc"
149#elif defined __MINGW32__
150#define OS_STRING "win_mingw"
151#endif
152
153#define ID_INLINE __inline
154#define PATH_SEP '\\'
155
156#if defined( _M_IX86 ) || defined( __i386__ )
157#define ARCH_STRING "x86"
158#endif
159
160#define Q3_LITTLE_ENDIAN
161
162#define DLL_EXT ".dll"
163#define EXE_EXT ".exe"
164
165#endif
166
167//============================================================== MAC OS X ===
168
169#if defined(MACOS_X) || defined(__APPLE_CC__)
170
171// make sure this is defined, just for sanity's sake...
172#ifndef MACOS_X
173#define MACOS_X
174#endif
175
176#define OS_STRING "macosx"
177#define ID_INLINE inline
178#define PATH_SEP '/'
179
180#ifdef __ppc__
181# define ARCH_STRING "ppc"
182# define Q3_BIG_ENDIAN
183#elif defined __i386__
184# define ARCH_STRING "i386"
185# define Q3_LITTLE_ENDIAN
186#endif
187
188#define DLL_EXT ".dylib"
189#define EXE_EXT ""
190
191#endif
192
193//================================================================= LINUX ===
194
195#ifdef __linux__
196
197#ifndef _LINUX
198#define _LINUX
199#endif
200
201#include <stdint.h>
202#include <endian.h>
203
204#define OS_STRING "linux"
205#define ID_INLINE inline
206#define PATH_SEP '/'
207
208#if defined(__i386) || defined(__i386__) || defined(_M_IX86)
209# define ARCH_STRING "x86"
210#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
211# define ARCH_STRING "x86_64"
212#elif defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
213# if __BIG_ENDIAN__
214# define ARCH_STRING "ppc64"
215# else
216# define ARCH_STRING "ppc64el"
217# endif
218#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__)
219# define ARCH_STRING "ppc"
220#elif defined __s390__
221# define ARCH_STRING "s390"
222#elif defined __s390x__
223# define ARCH_STRING "s390x"
224#elif defined __ia64__
225# define ARCH_STRING "ia64"
226#elif defined __e2k__
227# define ARCH_STRING "e2k"
228#elif defined __alpha__
229# define ARCH_STRING "alpha"
230#elif defined __sparc__
231# define ARCH_STRING "sparc"
232#elif defined(__aarch64__) || defined(__ARM64__) || defined(_M_ARM64)
233# define ARCH_STRING "arm64"
234#elif defined __arm__ || defined (_M_ARM)
235# if defined(__ARM_PCS_VFP) && (__ARM_PCS_VFP)
236# define ARCH_STRING "armhf"
237# else
238# define ARCH_STRING "armel"
239# endif
240#elif defined __cris__
241# define ARCH_STRING "cris"
242#elif defined __hppa__
243# define ARCH_STRING "hppa"
244#elif defined __mips__
245# define ARCH_STRING "mips"
246#elif defined __sh__
247# define ARCH_STRING "sh"
248#elif defined __riscv
249# if __UINTPTR_MAX__ == __UINT64_MAX__
250# define ARCH_STRING "riscv64"
251# else
252# define ARCH_STRING "riscv"
253# endif
254#endif
255
256#if __BIG_ENDIAN__
257# define Q3_BIG_ENDIAN
258#else
259# define Q3_LITTLE_ENDIAN
260#endif
261
262#define DLL_EXT ".so"
263#define EXE_EXT ""
264
265#endif
266
267//================================================================ MAC OS ===
268
269#if defined(__APPLE__) || defined(__APPLE_CC__)
270
271#define OS_STRING "macosx"
272#define ID_INLINE inline
273#define PATH_SEP '/'
274
275#ifdef __ppc__
276# define ARCH_STRING "ppc"
277# define Q3_BIG_ENDIAN
278#elif defined __i386__
279# define ARCH_STRING "x86"
280# define Q3_LITTLE_ENDIAN
281#elif defined __x86_64__
282# undef idx64
283# define idx64 1
284# define ARCH_STRING "x86_64"
285# define Q3_LITTLE_ENDIAN
286#elif defined __aarch64__
287# define ARCH_STRING "arm64"
288# define Q3_LITTLE_ENDIAN
289#endif
290
291#define DLL_EXT ".dylib"
292#define EXE_EXT ""
293
294#endif
295
296//=================================================================== BSD ===
297
298#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
299
300#include <sys/types.h>
301#include <machine/endian.h>
302
303#if defined(__FreeBSD__)
304#define OS_STRING "freebsd"
305#elif defined(__OpenBSD__)
306#define OS_STRING "openbsd"
307#elif defined(__NetBSD__)
308#define OS_STRING "netbsd"
309#endif
310
311#define ID_INLINE inline
312#define PATH_SEP '/'
313
314#if defined(__i386__) || defined(__i386)
315#define ARCH_STRING "x86"
316#elif defined(__amd64__) || defined(__x86_64__)
317#define ARCH_STRING "x86_64"
318#elif defined(__arm__)
319#define ARCH_STRING "arm"
320#elif defined(__aarch64__)
321#define ARCH_STRING "arm64"
322#elif defined(__powerpc__) || defined(__ppc__)
323#define ARCH_STRING "ppc"
324#elif defined(__powerpc64__)
325#define ARCH_STRING "ppc64"
326#elif defined(__sparc64__)
327#define ARCH_STRING "sparc64"
328#elif defined(__mips__)
329#define ARCH_STRING "mips"
330#elif defined(__riscv)
331#if __SIZEOF_POINTER__ == 8
332#define ARCH_STRING "riscv64"
333#else
334#define ARCH_STRING "riscv"
335#endif
336#else
337#define ARCH_STRING "unknown"
338#endif
339
340#if BYTE_ORDER == BIG_ENDIAN
341#define Q3_BIG_ENDIAN
342#else
343#define Q3_LITTLE_ENDIAN
344#endif
345
346#define DLL_EXT ".so"
347#define EXE_EXT ""
348
349#endif
350
351//================================================================= SUNOS ===
352
353#ifdef __sun
354
355#include <stdint.h>
356#include <sys/byteorder.h>
357
358#define OS_STRING "solaris"
359#define ID_INLINE inline
360#define PATH_SEP '/'
361
362#ifdef __i386__
363#define ARCH_STRING "i386"
364#elif defined __sparc
365#define ARCH_STRING "sparc"
366#endif
367
368#if defined( _BIG_ENDIAN )
369#define Q3_BIG_ENDIAN
370#elif defined( _LITTLE_ENDIAN )
371#define Q3_LITTLE_ENDIAN
372#endif
373
374#define DLL_EXT ".so"
375#define EXE_EXT ""
376
377#endif
378
379//================================================================== IRIX ===
380
381#ifdef __sgi
382
383#define OS_STRING "irix"
384#define ID_INLINE __inline
385#define PATH_SEP '/'
386
387#define ARCH_STRING "mips"
388
389#define Q3_BIG_ENDIAN // SGI's MIPS are always big endian
390
391#define DLL_EXT ".so"
392#define EXE_EXT ""
393
394#endif
395
396//============================================================ EMSCRIPTEN ===
397
398#ifdef __EMSCRIPTEN__
399
400#define OS_STRING "emscripten"
401#define ID_INLINE inline
402#define PATH_SEP '/'
403
404#define ARCH_STRING "wasm32"
405
406#define Q3_LITTLE_ENDIAN
407
408#define DLL_EXT ".wasm"
409
410#endif
411
412//================================================================== Q3VM ===
413
414#ifdef Q3_VM
415
416#define OS_STRING "q3vm"
417#define ID_INLINE
418#define PATH_SEP '/'
419
420#define ARCH_STRING "bytecode"
421
422#define DLL_EXT ".qvm"
423
424#endif
425
426//===========================================================================
427
428// Catch missing defines in above blocks
429
430#ifndef OS_STRING
431#error "Operating system not supported"
432#endif
433
434#ifndef ARCH_STRING
435// ARCH_STRING is (mostly) only used for informational purposes, so we allow
436// it to be undefined so that more diverse architectures may be compiled
437#define ARCH_STRING "unknown"
438#endif
439
440#ifndef ID_INLINE
441#error "ID_INLINE not defined"
442#endif
443
444#ifndef PATH_SEP
445#error "PATH_SEP not defined"
446#endif
447
448#ifndef DLL_EXT
449#error "DLL_EXT not defined"
450#endif
451
452#ifdef __cplusplus
453extern "C" {
454#endif
455
456//endianness
457void CopyShortSwap(void* dest, const void* src);
458void CopyLongSwap(void* dest, const void* src);
459short ShortSwap(short l);
460unsigned short UnsignedShortSwap(unsigned short l);
461int LongSwap(int l);
462unsigned int UnsignedLongSwap(unsigned int l);
463float FloatSwap(const float* f);
464short ShortSwapPtr(const void* l);
465int LongSwapPtr(const void* l);
466short ShortNoSwapPtr(const void* l);
467int LongNoSwapPtr(const void* l);
468float FloatSwapPtr(const void* l);
469float FloatNoSwapPtr(const void* l);
470void SwapValue(void* dest, size_t size);
471
472#ifdef __cplusplus
473}
474#endif
475
476#if defined( Q3_BIG_ENDIAN ) && defined( Q3_LITTLE_ENDIAN )
477#error "Endianness defined as both big and little"
478#elif defined( Q3_BIG_ENDIAN )
479
480#define CopyLittleShort(dest, src) CopyShortSwap(dest, src)
481#define CopyLittleLong(dest, src) CopyLongSwap(dest, src)
482
483//
484// Those Little*Ptr are used to avoid alignment problems
485//
486
487#define LittleShort(x) ShortSwap(x)
488#define LittleUnsignedShort(x) UnsignedShortSwap(x)
489#define LittleLong(x) LongSwap(x)
490#define LittleUnsignedLong(x) UnsignedLongSwap(x)
491#define LittleFloat(x) FloatSwap(&x)
492#define LittleShortPtr(x) ShortSwapPtr(&x)
493#define LittleLongPtr(x) LongSwapPtr(&x)
494#define LittleFloatPtr(x) FloatSwapPtr(&x)
495#define LittleSwap(x, size) SwapValue(x, size)
496
497#define BigShort
498#define BigLong
499#define BigFloat
500#define BigShortPtr(x) ShortNoSwapPtr(&x)
501#define BigLongPtr(x) LongNoSwapPtr(&x)
502#define BigSwap(x, size)
503
504#elif defined( Q3_LITTLE_ENDIAN )
505
506#define CopyLittleShort(dest, src) Com_Memcpy(dest, src, 2)
507#define CopyLittleLong(dest, src) Com_Memcpy(dest, src, 4)
508
509#define LittleShort
510#define LittleUnsignedShort
511#define LittleLong
512#define LittleFloat
513#define LittleShortPtr(x) ShortNoSwapPtr(&x)
514#define LittleLongPtr(x) LongNoSwapPtr(&x)
515#define LittleFloatPtr(x) FloatNoSwapPtr(&x)
516#define LittleSwap(x, size)
517
518#define BigShort(x) ShortSwap(x)
519#define BigUnsignedShort(x) UnsignedShortSwap(x)
520#define BigLong(x) LongSwap(x)
521#define BigUnsignedLong(x) UnsignedLongSwap(x)
522#define BigFloat(x) FloatSwap(&x)
523#define BigShortPtr(x) ShortSwapPtr(&x)
524#define BigLongPtr(x) LongSwapPtr(&x)
525#define BigSwap(x, size) SwapValue(x, size)
526
527#else
528#error "Endianness not defined"
529#endif
530
531//platform string
532#ifdef NDEBUG
533#define PLATFORM_STRING OS_STRING "-" ARCH_STRING
534#else
535#define PLATFORM_STRING OS_STRING "-" ARCH_STRING "-debug"
536#endif
537
538#endif