mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef _C4_CPU_HPP_
 | |
| #define _C4_CPU_HPP_
 | |
| 
 | |
| /** @file cpu.hpp Provides processor information macros
 | |
|  * @ingroup basic_headers */
 | |
| 
 | |
| // see also https://sourceforge.net/p/predef/wiki/Architectures/
 | |
| // see also https://sourceforge.net/p/predef/wiki/Endianness/
 | |
| // see also https://github.com/googlesamples/android-ndk/blob/android-mk/hello-jni/jni/hello-jni.c
 | |
| // see http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/global/qprocessordetection.h
 | |
| 
 | |
| #ifdef __ORDER_LITTLE_ENDIAN__
 | |
| #   define _C4EL __ORDER_LITTLE_ENDIAN__
 | |
| #else
 | |
| #   define _C4EL 1234
 | |
| #endif
 | |
| 
 | |
| #ifdef __ORDER_BIG_ENDIAN__
 | |
| #   define _C4EB __ORDER_BIG_ENDIAN__
 | |
| #else
 | |
| #   define _C4EB 4321
 | |
| #endif
 | |
| 
 | |
| // mixed byte order (eg, PowerPC or ia64)
 | |
| #define _C4EM 1111
 | |
| 
 | |
| #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
 | |
| #    define C4_CPU_X86_64
 | |
| #    define C4_WORDSIZE 8
 | |
| #    define C4_BYTE_ORDER _C4EL
 | |
| 
 | |
| #elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
 | |
| #    define C4_CPU_X86
 | |
| #    define C4_WORDSIZE 4
 | |
| #    define C4_BYTE_ORDER _C4EL
 | |
| 
 | |
| #elif defined(__arm__) || defined(_M_ARM) \
 | |
|     || defined(__TARGET_ARCH_ARM) || defined(__aarch64__) || defined(_M_ARM64)
 | |
| #   if defined(__aarch64__) || defined(_M_ARM64)
 | |
| #       define C4_CPU_ARM64
 | |
| #       define C4_CPU_ARMV8
 | |
| #       define C4_WORDSIZE 8
 | |
| #   else
 | |
| #       define C4_CPU_ARM
 | |
| #       define C4_WORDSIZE 4
 | |
| #       if defined(__ARM_ARCH_8__) || defined(__ARM_ARCH_8A__)  \
 | |
|         || (defined(__ARCH_ARM) && __ARCH_ARM >= 8) \
 | |
|         || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 8)
 | |
| #           define C4_CPU_ARMV8
 | |
| #       elif defined(__ARM_ARCH_7__) || defined(_ARM_ARCH_7)    \
 | |
|         || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) \
 | |
|         || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) \
 | |
|         || defined(__ARM_ARCH_7EM__) \
 | |
|         || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 7) \
 | |
|         || (defined(_M_ARM) && _M_ARM >= 7)
 | |
| #           define C4_CPU_ARMV7
 | |
| #       elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
 | |
|         || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) \
 | |
|         || defined(__ARM_ARCH_6K__)  || defined(__ARM_ARCH_6ZK__) \
 | |
|         || defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_6KZ__) \
 | |
|         || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 6)
 | |
| #           define C4_CPU_ARMV6
 | |
| #       elif defined(__ARM_ARCH_5TEJ__) \
 | |
|         || defined(__ARM_ARCH_5TE__) \
 | |
|         || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 5)
 | |
| #           define C4_CPU_ARMV5
 | |
| #       elif defined(__ARM_ARCH_4T__) \
 | |
|         || (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM >= 4)
 | |
| #           define C4_CPU_ARMV4
 | |
| #       else
 | |
| #           error "unknown CPU architecture: ARM"
 | |
| #       endif
 | |
| #   endif
 | |
| #   if defined(__ARMEL__) || defined(__LITTLE_ENDIAN__) || defined(__AARCH64EL__) \
 | |
|        || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) \
 | |
|        || defined(_MSC_VER) // winarm64 does not provide any of the above macros,
 | |
|                             // but advises little-endianess:
 | |
|                             // https://docs.microsoft.com/en-us/cpp/build/overview-of-arm-abi-conventions?view=msvc-170
 | |
|                             // So if it is visual studio compiling, we'll assume little endian.
 | |
| #       define C4_BYTE_ORDER _C4EL
 | |
| #   elif defined(__ARMEB__) || defined(__BIG_ENDIAN__) || defined(__AARCH64EB__) \
 | |
|        || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
 | |
| #       define C4_BYTE_ORDER _C4EB
 | |
| #   elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_PDP_ENDIAN__)
 | |
| #       define C4_BYTE_ORDER _C4EM
 | |
| #   else
 | |
| #       error "unknown endianness"
 | |
| #   endif
 | |
| 
 | |
| #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
 | |
| #   define C4_CPU_IA64
 | |
| #   define C4_WORDSIZE 8
 | |
| #   define C4_BYTE_ORDER _C4EM
 | |
|    // itanium is bi-endian - check byte order below
 | |
| 
 | |
| #elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__)       \
 | |
|     || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC)  \
 | |
|     || defined(_M_MPPC) || defined(_M_PPC)
 | |
| #   if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
 | |
| #       define C4_CPU_PPC64
 | |
| #       define C4_WORDSIZE 8
 | |
| #   else
 | |
| #       define C4_CPU_PPC
 | |
| #       define C4_WORDSIZE 4
 | |
| #   endif
 | |
| #   define C4_BYTE_ORDER _C4EM
 | |
|    // ppc is bi-endian - check byte order below
 | |
| 
 | |
| #elif defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH_)
 | |
| #   define C4_CPU_S390_X
 | |
| #   define C4_WORDSIZE 8
 | |
| #   define C4_BYTE_ORDER _C4EB
 | |
| 
 | |
| #elif defined(__xtensa__) || defined(__XTENSA__)
 | |
| #   define C4_CPU_XTENSA
 | |
| #   define C4_WORDSIZE 4
 | |
| // not sure about this...
 | |
| #   if defined(__XTENSA_EL__) || defined(__xtensa_el__)
 | |
| #       define C4_BYTE_ORDER _C4EL
 | |
| #   else
 | |
| #       define C4_BYTE_ORDER _C4EB
 | |
| #   endif
 | |
| 
 | |
| #elif defined(__riscv)
 | |
| #   if __riscv_xlen == 64
 | |
| #       define C4_CPU_RISCV64
 | |
| #       define C4_WORDSIZE 8
 | |
| #   else
 | |
| #       define C4_CPU_RISCV32
 | |
| #       define C4_WORDSIZE 4
 | |
| #   endif
 | |
| #   define C4_BYTE_ORDER _C4EL
 | |
| 
 | |
| #elif defined(__EMSCRIPTEN__)
 | |
| #   define C4_BYTE_ORDER _C4EL
 | |
| #   define C4_WORDSIZE 4
 | |
| 
 | |
| #elif defined(SWIG)
 | |
| #   error "please define CPU architecture macros when compiling with swig"
 | |
| 
 | |
| #else
 | |
| #   error "unknown CPU architecture"
 | |
| #endif
 | |
| 
 | |
| #define C4_LITTLE_ENDIAN (C4_BYTE_ORDER == _C4EL)
 | |
| #define C4_BIG_ENDIAN (C4_BYTE_ORDER == _C4EB)
 | |
| #define C4_MIXED_ENDIAN (C4_BYTE_ORDER == _C4EM)
 | |
| 
 | |
| #endif /* _C4_CPU_HPP_ */
 | 
