OpenMoHAA 0.82.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#ifndef __ASM_I386__ // don't include the C bits if included from qasm.h
74
75// for windows fastcall option
76#define QDECL
77#define QCALL
78
79#define MAC_STATIC
80
81//================================================================= WIN64/32 ===
82
83#if defined(_DEBUG)
84#define DLL_SUFFIX "-dbg"
85#else
86#define DLL_SUFFIX
87#endif
88
89#if defined(TARGET_LOCAL_SYSTEM)
90# define ARCH_SUFFIX
91#elif defined(TARGET_MULTIPLE_ARCHITECTURES)
92// Targeting multiple architecture in a single binary.
93// For example, OSX supports compiling multiple architectures in a single binary
94# define ARCH_SUFFIX ".multiarch"
95#else
96# define ARCH_SUFFIX "." ARCH_STRING
97#endif
98
99// alloca
100#ifdef _MSC_VER
101# include <malloc.h>
102#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
103# include <stdlib.h>
104#else
105# include <alloca.h>
106#endif
107
108#if defined(_WIN64) || defined(__WIN64__)
109
110#undef idx64
111#define idx64 1
112
113#undef QDECL
114#define QDECL __cdecl
115
116#undef QCALL
117#define QCALL __stdcall
118
119#if defined( _MSC_VER )
120#define OS_STRING "win_msvc64"
121#elif defined __MINGW64__
122#define OS_STRING "win_mingw64"
123#endif
124
125#define ID_INLINE __inline
126#define PATH_SEP '\\'
127
128#if defined(_WIN64) || defined( __WIN64__ )
129#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
130# define ARCH_STRING "x86_64"
131#elif defined(__aarch64__) || defined(__ARM64__) || defined (_M_ARM64)
132# define ARCH_STRING "arm64"
133#endif
134#elif defined _M_ALPHA
135# define ARCH_STRING "AXP"
136#endif
137
138#define Q3_LITTLE_ENDIAN
139
140#define DLL_EXT ".dll"
141#define EXE_EXT ".exe"
142
143#elif defined(_WIN32) || defined(__WIN32__)
144
145#undef QDECL
146#define QDECL __cdecl
147
148#undef QCALL
149#define QCALL __stdcall
150
151#if defined( _MSC_VER )
152#define OS_STRING "win_msvc"
153#elif defined __MINGW32__
154#define OS_STRING "win_mingw"
155#endif
156
157#define ID_INLINE __inline
158#define PATH_SEP '\\'
159
160#if defined( _M_IX86 ) || defined( __i386__ )
161#define ARCH_STRING "x86"
162#elif defined _M_ALPHA
163#define ARCH_STRING "AXP"
164#endif
165
166#define Q3_LITTLE_ENDIAN
167
168#define DLL_EXT ".dll"
169#define EXE_EXT ".exe"
170
171#endif
172
173//============================================================== MAC OS X ===
174
175#if defined(MACOS_X) || defined(__APPLE_CC__)
176
177// make sure this is defined, just for sanity's sake...
178#ifndef MACOS_X
179#define MACOS_X
180#endif
181
182#define OS_STRING "macosx"
183#define ID_INLINE inline
184#define PATH_SEP '/'
185
186#ifdef __ppc__
187# define ARCH_STRING "ppc"
188# define Q3_BIG_ENDIAN
189#elif defined __i386__
190# define ARCH_STRING "i386"
191# define Q3_LITTLE_ENDIAN
192#endif
193
194#define DLL_EXT ".dylib"
195#define EXE_EXT ""
196
197#endif
198
199//================================================================= LINUX ===
200
201#ifdef __linux__
202
203#ifndef _LINUX
204#define _LINUX
205#endif
206
207#include <stdint.h>
208#include <endian.h>
209
210#define OS_STRING "linux"
211#define ID_INLINE inline
212#define PATH_SEP '/'
213
214#if defined(__i386) || defined(__i386__) || defined(_M_IX86)
215# define ARCH_STRING "x86"
216#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
217# define ARCH_STRING "x86_64"
218#elif defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
219# if __BIG_ENDIAN__
220# define ARCH_STRING "ppc64"
221# else
222# define ARCH_STRING "ppc64el"
223# endif
224#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__)
225# define ARCH_STRING "ppc"
226#elif defined __s390__
227# define ARCH_STRING "s390"
228#elif defined __s390x__
229# define ARCH_STRING "s390x"
230#elif defined __ia64__
231# define ARCH_STRING "ia64"
232#elif defined __e2k__
233# define ARCH_STRING "e2k"
234#elif defined __alpha__
235# define ARCH_STRING "alpha"
236#elif defined __sparc__
237# define ARCH_STRING "sparc"
238#elif defined(__aarch64__) || defined(__ARM64__) || defined(_M_ARM64)
239# define ARCH_STRING "arm64"
240#elif defined __arm__ || defined (_M_ARM)
241# if defined(__ARM_PCS_VFP) && (__ARM_PCS_VFP)
242# define ARCH_STRING "armhf"
243# else
244# define ARCH_STRING "armel"
245# endif
246#elif defined __cris__
247# define ARCH_STRING "cris"
248#elif defined __hppa__
249# define ARCH_STRING "hppa"
250#elif defined __mips__
251# define ARCH_STRING "mips"
252#elif defined __sh__
253# define ARCH_STRING "sh"
254#elif defined __riscv
255# if __UINTPTR_MAX__ == __UINT64_MAX__
256# define ARCH_STRING "riscv64"
257# else
258# define ARCH_STRING "riscv"
259# endif
260#endif
261
262#if __BIG_ENDIAN__
263# define Q3_BIG_ENDIAN
264#else
265# define Q3_LITTLE_ENDIAN
266#endif
267
268#define DLL_EXT ".so"
269#define EXE_EXT ""
270
271#endif
272
273//============================================================== MAC OS X ===
274
275#if defined(__APPLE__) || defined(__APPLE_CC__)
276
277#define OS_STRING "macosx"
278#define ID_INLINE inline
279#define PATH_SEP '/'
280
281#ifdef __ppc__
282# define ARCH_STRING "ppc"
283# define Q3_BIG_ENDIAN
284#elif defined __i386__
285# define ARCH_STRING "x86"
286# define Q3_LITTLE_ENDIAN
287#elif defined __x86_64__
288# undef idx64
289# define idx64 1
290# define ARCH_STRING "x86_64"
291# define Q3_LITTLE_ENDIAN
292#elif defined __aarch64__
293# define ARCH_STRING "arm64"
294# define Q3_LITTLE_ENDIAN
295#ifndef NO_VM_COMPILED
296# define NO_VM_COMPILED
297#endif
298#endif
299
300#define DLL_EXT ".dylib"
301#define EXE_EXT ""
302
303#endif
304
305//=================================================================== BSD ===
306
307#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
308
309#include <sys/types.h>
310#include <machine/endian.h>
311
312#if defined(__FreeBSD__)
313#define OS_STRING "freebsd"
314#elif defined(__OpenBSD__)
315#define OS_STRING "openbsd"
316#elif defined(__NetBSD__)
317#define OS_STRING "netbsd"
318#endif
319
320#define ID_INLINE inline
321#define PATH_SEP '/'
322
323#if defined(__i386__) || defined(__i386)
324#define ARCH_STRING "x86"
325#elif defined(__amd64__) || defined(__x86_64__)
326#define ARCH_STRING "x86_64"
327#elif defined(__arm__)
328#define ARCH_STRING "arm"
329#elif defined(__aarch64__)
330#define ARCH_STRING "arm64"
331#elif defined(__powerpc__) || defined(__ppc__)
332#define ARCH_STRING "ppc"
333#elif defined(__powerpc64__)
334#define ARCH_STRING "ppc64"
335#elif defined(__sparc64__)
336#define ARCH_STRING "sparc64"
337#elif defined(__mips__)
338#define ARCH_STRING "mips"
339#elif defined(__riscv)
340#if __SIZEOF_POINTER__ == 8
341#define ARCH_STRING "riscv64"
342#else
343#define ARCH_STRING "riscv"
344#endif
345#else
346#define ARCH_STRING "unknown"
347#endif
348
349#if BYTE_ORDER == BIG_ENDIAN
350#define Q3_BIG_ENDIAN
351#else
352#define Q3_LITTLE_ENDIAN
353#endif
354
355#define DLL_EXT ".so"
356#define EXE_EXT ""
357
358#endif
359
360//================================================================= SUNOS ===
361
362#ifdef __sun
363
364#include <stdint.h>
365#include <sys/byteorder.h>
366
367#define OS_STRING "solaris"
368#define ID_INLINE inline
369#define PATH_SEP '/'
370
371#ifdef __i386__
372#define ARCH_STRING "i386"
373#elif defined __sparc
374#define ARCH_STRING "sparc"
375#endif
376
377#if defined( _BIG_ENDIAN )
378#define Q3_BIG_ENDIAN
379#elif defined( _LITTLE_ENDIAN )
380#define Q3_LITTLE_ENDIAN
381#endif
382
383#define DLL_EXT ".so"
384#define EXE_EXT ""
385
386#endif
387
388//================================================================== IRIX ===
389
390#ifdef __sgi
391
392#define OS_STRING "irix"
393#define ID_INLINE __inline
394#define PATH_SEP '/'
395
396#define ARCH_STRING "mips"
397
398#define Q3_BIG_ENDIAN // SGI's MIPS are always big endian
399
400#define DLL_EXT ".so"
401#define EXE_EXT ""
402
403#endif
404
405//================================================================== EMSCRIPTEN ===
406
407#ifdef __EMSCRIPTEN__
408
409#define OS_STRING "emscripten"
410#define ID_INLINE inline
411#define PATH_SEP '/'
412
413#define ARCH_STRING "wasm32"
414
415#define Q3_LITTLE_ENDIAN
416
417#define DLL_EXT ".wasm"
418
419#endif
420
421//================================================================== Q3VM ===
422
423#ifdef Q3_VM
424
425#define OS_STRING "q3vm"
426#define ID_INLINE
427#define PATH_SEP '/'
428
429#define ARCH_STRING "bytecode"
430
431#define DLL_EXT ".qvm"
432
433#endif
434
435//===========================================================================
436
437//catch missing defines in above blocks
438#if !defined( OS_STRING )
439#error "Operating system not supported"
440#endif
441
442#if !defined( ARCH_STRING )
443#error "Architecture not supported"
444#endif
445
446#ifndef ID_INLINE
447#error "ID_INLINE not defined"
448#endif
449
450#ifndef PATH_SEP
451#error "PATH_SEP not defined"
452#endif
453
454#ifndef DLL_EXT
455#error "DLL_EXT not defined"
456#endif
457
458//endianness
459void CopyShortSwap(void* dest, const void* src);
460void CopyLongSwap(void* dest, const void* src);
461short ShortSwap(short l);
462unsigned short UnsignedShortSwap(unsigned short l);
463int LongSwap(int l);
464unsigned int UnsignedLongSwap(unsigned int l);
465float FloatSwap(const float* f);
466short ShortSwapPtr(const void* l);
467int LongSwapPtr(const void* l);
468short ShortNoSwapPtr(const void* l);
469int LongNoSwapPtr(const void* l);
470float FloatSwapPtr(const void* l);
471float FloatNoSwapPtr(const void* l);
472void SwapValue(void* dest, size_t size);
473
474#if defined( Q3_BIG_ENDIAN ) && defined( Q3_LITTLE_ENDIAN )
475#error "Endianness defined as both big and little"
476#elif defined( Q3_BIG_ENDIAN )
477
478#define CopyLittleShort(dest, src) CopyShortSwap(dest, src)
479#define CopyLittleLong(dest, src) CopyLongSwap(dest, src)
480
481//
482// Those Little*Ptr are used to avoid alignment problems
483//
484
485#define LittleShort(x) ShortSwap(x)
486#define LittleUnsignedShort(x) UnsignedShortSwap(x)
487#define LittleLong(x) LongSwap(x)
488#define LittleUnsignedLong(x) UnsignedLongSwap(x)
489#define LittleFloat(x) FloatSwap(&x)
490#define LittleShortPtr(x) ShortSwapPtr(&x)
491#define LittleLongPtr(x) LongSwapPtr(&x)
492#define LittleFloatPtr(x) FloatSwapPtr(&x)
493#define LittleSwap(x, size) SwapValue(x, size)
494
495#define BigShort
496#define BigLong
497#define BigFloat
498#define BigShortPtr(x) ShortNoSwapPtr(&x)
499#define BigLongPtr(x) LongNoSwapPtr(&x)
500#define BigSwap(x, size)
501
502#elif defined( Q3_LITTLE_ENDIAN )
503
504#define CopyLittleShort(dest, src) Com_Memcpy(dest, src, 2)
505#define CopyLittleLong(dest, src) Com_Memcpy(dest, src, 4)
506
507#define LittleShort
508#define LittleUnsignedShort
509#define LittleLong
510#define LittleFloat
511#define LittleShortPtr(x) ShortNoSwapPtr(&x)
512#define LittleLongPtr(x) LongNoSwapPtr(&x)
513#define LittleFloatPtr(x) FloatNoSwapPtr(&x)
514#define LittleSwap(x, size)
515
516#define BigShort(x) ShortSwap(x)
517#define BigUnsignedShort(x) UnsignedShortSwap(x)
518#define BigLong(x) LongSwap(x)
519#define BigUnsignedLong(x) UnsignedLongSwap(x)
520#define BigFloat(x) FloatSwap(&x)
521#define BigShortPtr(x) ShortSwapPtr(&x)
522#define BigLongPtr(x) LongSwapPtr(&x)
523#define BigSwap(x, size) SwapValue(x, size)
524
525#else
526#error "Endianness not defined"
527#endif
528
529//platform string
530#ifdef NDEBUG
531#define PLATFORM_STRING OS_STRING "-" ARCH_STRING
532#else
533#define PLATFORM_STRING OS_STRING "-" ARCH_STRING "-debug"
534#endif
535
536#endif
537
538#endif