ljx

FORK: LuaJIT with native 5.2 and 5.3 support
git clone https://git.neptards.moe/neptards/ljx.git
Log | Files | Refs | README

lj_arch.h (15297B)


      1 /*
      2 ** Target architecture selection.
      3 ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
      4 */
      5 
      6 #ifndef _LJ_ARCH_H
      7 #define _LJ_ARCH_H
      8 
      9 /* Target endianess. */
     10 #define LUAJIT_LE	0
     11 #define LUAJIT_BE	1
     12 
     13 /* Target architectures. */
     14 #define LUAJIT_ARCH_X86		1
     15 #define LUAJIT_ARCH_x86		1
     16 #define LUAJIT_ARCH_X64		2
     17 #define LUAJIT_ARCH_x64		2
     18 #define LUAJIT_ARCH_ARM		3
     19 #define LUAJIT_ARCH_arm		3
     20 #define LUAJIT_ARCH_ARM64	4
     21 #define LUAJIT_ARCH_arm64	4
     22 #define LUAJIT_ARCH_PPC		5
     23 #define LUAJIT_ARCH_ppc		5
     24 #define LUAJIT_ARCH_MIPS	6
     25 #define LUAJIT_ARCH_mips	6
     26 #define LUAJIT_ARCH_MIPS32	6
     27 #define LUAJIT_ARCH_mips32	6
     28 #define LUAJIT_ARCH_MIPS64	7
     29 #define LUAJIT_ARCH_mips64	7
     30 
     31 /* Target OS. */
     32 #define LUAJIT_OS_OTHER		0
     33 #define LUAJIT_OS_WINDOWS	1
     34 #define LUAJIT_OS_LINUX		2
     35 #define LUAJIT_OS_OSX		3
     36 #define LUAJIT_OS_BSD		4
     37 #define LUAJIT_OS_POSIX		5
     38 
     39 /* Select native target if no target defined. */
     40 #ifndef LUAJIT_TARGET
     41 
     42 #if defined(__i386) || defined(__i386__) || defined(_M_IX86)
     43 #define LUAJIT_TARGET	LUAJIT_ARCH_X86
     44 #elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
     45 #define LUAJIT_TARGET	LUAJIT_ARCH_X64
     46 #elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM)
     47 #define LUAJIT_TARGET	LUAJIT_ARCH_ARM
     48 #elif defined(__aarch64__)
     49 #define LUAJIT_TARGET	LUAJIT_ARCH_ARM64
     50 #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)
     51 #define LUAJIT_TARGET	LUAJIT_ARCH_PPC
     52 #elif defined(__mips64__) || defined(__mips64) || defined(__MIPS64__) || defined(__MIPS64)
     53 #define LUAJIT_TARGET	LUAJIT_ARCH_MIPS64
     54 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)
     55 #define LUAJIT_TARGET	LUAJIT_ARCH_MIPS32
     56 #else
     57 #error "No support for this architecture (yet)"
     58 #endif
     59 
     60 #endif
     61 
     62 /* Select native OS if no target OS defined. */
     63 #ifndef LUAJIT_OS
     64 
     65 #if defined(_WIN32) && !defined(_XBOX_VER)
     66 #define LUAJIT_OS	LUAJIT_OS_WINDOWS
     67 #elif defined(__linux__)
     68 #define LUAJIT_OS	LUAJIT_OS_LINUX
     69 #elif defined(__MACH__) && defined(__APPLE__)
     70 #define LUAJIT_OS	LUAJIT_OS_OSX
     71 #elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
     72        defined(__NetBSD__) || defined(__OpenBSD__) || \
     73        defined(__DragonFly__)) && !defined(__ORBIS__)
     74 #define LUAJIT_OS	LUAJIT_OS_BSD
     75 #elif (defined(__sun__) && defined(__svr4__))
     76 #define LUAJIT_OS	LUAJIT_OS_POSIX
     77 #elif defined(__CYGWIN__)
     78 #define LJ_TARGET_CYGWIN	1
     79 #define LUAJIT_OS	LUAJIT_OS_POSIX
     80 #else
     81 #define LUAJIT_OS	LUAJIT_OS_OTHER
     82 #endif
     83 
     84 #endif
     85 
     86 /* Set target OS properties. */
     87 #if LUAJIT_OS == LUAJIT_OS_WINDOWS
     88 #define LJ_OS_NAME	"Windows"
     89 #elif LUAJIT_OS == LUAJIT_OS_LINUX
     90 #define LJ_OS_NAME	"Linux"
     91 #elif LUAJIT_OS == LUAJIT_OS_OSX
     92 #define LJ_OS_NAME	"OSX"
     93 #elif LUAJIT_OS == LUAJIT_OS_BSD
     94 #define LJ_OS_NAME	"BSD"
     95 #elif LUAJIT_OS == LUAJIT_OS_POSIX
     96 #define LJ_OS_NAME	"POSIX"
     97 #else
     98 #define LJ_OS_NAME	"Other"
     99 #endif
    100 
    101 #define LJ_TARGET_WINDOWS	(LUAJIT_OS == LUAJIT_OS_WINDOWS)
    102 #define LJ_TARGET_LINUX		(LUAJIT_OS == LUAJIT_OS_LINUX)
    103 #define LJ_TARGET_OSX		(LUAJIT_OS == LUAJIT_OS_OSX)
    104 #define LJ_TARGET_IOS		(LJ_TARGET_OSX && (LUAJIT_TARGET == LUAJIT_ARCH_ARM || LUAJIT_TARGET == LUAJIT_ARCH_ARM64))
    105 #define LJ_TARGET_POSIX		(LUAJIT_OS > LUAJIT_OS_WINDOWS)
    106 #define LJ_TARGET_DLOPEN	LJ_TARGET_POSIX
    107 #if LJ_TARGET_LINUX || LJ_TARGET_OSX || defined(__MINGW32__) || defined(__MINGW64__) || defined(__MSYS__)
    108 #define LJ_TARGET_READLINE	1
    109 #else
    110 #define LJ_TARGET_READLINE	0
    111 #endif
    112 
    113 #ifdef __CELLOS_LV2__
    114 #define LJ_TARGET_PS3		1
    115 #define LJ_TARGET_CONSOLE	1
    116 #endif
    117 
    118 #ifdef __ORBIS__
    119 #define LJ_TARGET_PS4		1
    120 #define LJ_TARGET_CONSOLE	1
    121 #undef NULL
    122 #define NULL ((void*)0)
    123 #endif
    124 
    125 #ifdef __psp2__
    126 #define LJ_TARGET_PSVITA	1
    127 #define LJ_TARGET_CONSOLE	1
    128 #endif
    129 
    130 #if _XBOX_VER >= 200
    131 #define LJ_TARGET_XBOX360	1
    132 #define LJ_TARGET_CONSOLE	1
    133 #endif
    134 
    135 #ifdef _DURANGO
    136 #define LJ_TARGET_XBOXONE	1
    137 #define LJ_TARGET_CONSOLE	1
    138 #define LJ_TARGET_GC64		1
    139 #endif
    140 
    141 #define LJ_NUMMODE_SINGLE	0	/* Single-number mode only. */
    142 #define LJ_NUMMODE_SINGLE_DUAL	1	/* Default to single-number mode. */
    143 #define LJ_NUMMODE_DUAL		2	/* Dual-number mode only. */
    144 #define LJ_NUMMODE_DUAL_SINGLE	3	/* Default to dual-number mode. */
    145 
    146 /* Set target architecture properties. */
    147 #if LUAJIT_TARGET == LUAJIT_ARCH_X86
    148 
    149 #define LJ_ARCH_NAME		"x86"
    150 #define LJ_ARCH_BITS		32
    151 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    152 #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
    153 #define LJ_ABI_WIN		1
    154 #else
    155 #define LJ_ABI_WIN		0
    156 #endif
    157 #define LJ_TARGET_X86		1
    158 #define LJ_TARGET_X86ORX64	1
    159 #define LJ_TARGET_EHRETREG	0
    160 #define LJ_TARGET_MASKSHIFT	1
    161 #define LJ_TARGET_MASKROT	1
    162 #define LJ_TARGET_UNALIGNED	1
    163 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL
    164 
    165 #elif LUAJIT_TARGET == LUAJIT_ARCH_X64
    166 
    167 #define LJ_ARCH_NAME		"x64"
    168 #define LJ_ARCH_BITS		64
    169 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    170 #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
    171 #define LJ_ABI_WIN		1
    172 #else
    173 #define LJ_ABI_WIN		0
    174 #endif
    175 #define LJ_TARGET_X64		1
    176 #define LJ_TARGET_X86ORX64	1
    177 #define LJ_TARGET_EHRETREG	0
    178 #define LJ_TARGET_JUMPRANGE	31	/* +-2^31 = +-2GB */
    179 #define LJ_TARGET_MASKSHIFT	1
    180 #define LJ_TARGET_MASKROT	1
    181 #define LJ_TARGET_UNALIGNED	1
    182 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_SINGLE_DUAL
    183 #ifdef LUAJIT_ENABLE_GC64
    184 #define LJ_TARGET_GC64		1
    185 #endif
    186 
    187 #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM
    188 
    189 #define LJ_ARCH_NAME		"arm"
    190 #define LJ_ARCH_BITS		32
    191 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    192 #if !defined(LJ_ARCH_HASFPU) && __SOFTFP__
    193 #define LJ_ARCH_HASFPU		0
    194 #endif
    195 #if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP
    196 #define LJ_ABI_SOFTFP		1
    197 #endif
    198 #define LJ_ABI_EABI		1
    199 #define LJ_TARGET_ARM		1
    200 #define LJ_TARGET_EHRETREG	0
    201 #define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */
    202 #define LJ_TARGET_MASKSHIFT	0
    203 #define LJ_TARGET_MASKROT	1
    204 #define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */
    205 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL
    206 
    207 #if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__
    208 #define LJ_ARCH_VERSION		80
    209 #elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__
    210 #define LJ_ARCH_VERSION		70
    211 #elif __ARM_ARCH_6T2__
    212 #define LJ_ARCH_VERSION		61
    213 #elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__
    214 #define LJ_ARCH_VERSION		60
    215 #else
    216 #define LJ_ARCH_VERSION		50
    217 #endif
    218 
    219 #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64
    220 
    221 #define LJ_ARCH_NAME		"arm64"
    222 #define LJ_ARCH_BITS		64
    223 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    224 #define LJ_TARGET_ARM64		1
    225 #define LJ_TARGET_EHRETREG	0
    226 #define LJ_TARGET_JUMPRANGE	27	/* +-2^27 = +-128MB */
    227 #define LJ_TARGET_MASKSHIFT	1
    228 #define LJ_TARGET_MASKROT	1
    229 #define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */
    230 #define LJ_TARGET_GC64		1
    231 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL
    232 #define LJ_ARCH_NOJIT		1	/* NYI */
    233 
    234 #define LJ_ARCH_VERSION		80
    235 
    236 #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC
    237 
    238 #ifndef LJ_ARCH_ENDIAN
    239 #if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
    240 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    241 #else
    242 #define LJ_ARCH_ENDIAN		LUAJIT_BE
    243 #endif
    244 #endif
    245 
    246 #if _LP64
    247 #define LJ_ARCH_BITS		64
    248 #if LJ_ARCH_ENDIAN == LUAJIT_LE
    249 #define LJ_ARCH_NAME		"ppc64le"
    250 #else
    251 #define LJ_ARCH_NAME		"ppc64"
    252 #endif
    253 #else
    254 #define LJ_ARCH_BITS		32
    255 #define LJ_ARCH_NAME		"ppc"
    256 #endif
    257 
    258 #define LJ_TARGET_PPC		1
    259 #define LJ_TARGET_EHRETREG	3
    260 #define LJ_TARGET_JUMPRANGE	25	/* +-2^25 = +-32MB */
    261 #define LJ_TARGET_MASKSHIFT	0
    262 #define LJ_TARGET_MASKROT	1
    263 #define LJ_TARGET_UNIFYROT	1	/* Want only IR_BROL. */
    264 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL_SINGLE
    265 
    266 #if LJ_TARGET_CONSOLE
    267 #define LJ_ARCH_PPC32ON64	1
    268 #define LJ_ARCH_NOFFI		1
    269 #elif LJ_ARCH_BITS == 64
    270 #define LJ_ARCH_PPC64		1
    271 #define LJ_TARGET_GC64		1
    272 #define LJ_ARCH_NOJIT		1	/* NYI */
    273 #endif
    274 
    275 #if _ARCH_PWR7
    276 #define LJ_ARCH_VERSION		70
    277 #elif _ARCH_PWR6
    278 #define LJ_ARCH_VERSION		60
    279 #elif _ARCH_PWR5X
    280 #define LJ_ARCH_VERSION		51
    281 #elif _ARCH_PWR5
    282 #define LJ_ARCH_VERSION		50
    283 #elif _ARCH_PWR4
    284 #define LJ_ARCH_VERSION		40
    285 #else
    286 #define LJ_ARCH_VERSION		0
    287 #endif
    288 #if _ARCH_PPCSQ
    289 #define LJ_ARCH_SQRT		1
    290 #endif
    291 #if _ARCH_PWR5X
    292 #define LJ_ARCH_ROUND		1
    293 #endif
    294 #if __PPU__
    295 #define LJ_ARCH_CELL		1
    296 #endif
    297 #if LJ_TARGET_XBOX360
    298 #define LJ_ARCH_XENON		1
    299 #endif
    300 
    301 #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 || LUAJIT_TARGET == LUAJIT_ARCH_MIPS64
    302 
    303 #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
    304 #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
    305 #define LJ_ARCH_NAME		"mipsel"
    306 #else
    307 #define LJ_ARCH_NAME		"mips64el"
    308 #endif
    309 #define LJ_ARCH_ENDIAN		LUAJIT_LE
    310 #else
    311 #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
    312 #define LJ_ARCH_NAME		"mips"
    313 #else
    314 #define LJ_ARCH_NAME		"mips64"
    315 #endif
    316 #define LJ_ARCH_ENDIAN		LUAJIT_BE
    317 #endif
    318 
    319 #if !defined(LJ_ARCH_HASFPU)
    320 #ifdef __mips_soft_float
    321 #define LJ_ARCH_HASFPU		0
    322 #else
    323 #define LJ_ARCH_HASFPU		1
    324 #endif
    325 #endif
    326 
    327 #if !defined(LJ_ABI_SOFTFP)
    328 #ifdef __mips_soft_float
    329 #define LJ_ABI_SOFTFP		1
    330 #else
    331 #define LJ_ABI_SOFTFP		0
    332 #endif
    333 #endif
    334 
    335 #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
    336 #define LJ_ARCH_BITS		32
    337 #define LJ_TARGET_MIPS32	1
    338 #else
    339 #define LJ_ARCH_BITS		64
    340 #define LJ_TARGET_MIPS64	1
    341 #define LJ_TARGET_GC64		1
    342 #define LJ_ARCH_NOJIT		1	/* NYI */
    343 #endif
    344 #define LJ_TARGET_MIPS		1
    345 #define LJ_TARGET_EHRETREG	4
    346 #define LJ_TARGET_JUMPRANGE	27	/* 2*2^27 = 256MB-aligned region */
    347 #define LJ_TARGET_MASKSHIFT	1
    348 #define LJ_TARGET_MASKROT	1
    349 #define LJ_TARGET_UNIFYROT	2	/* Want only IR_BROR. */
    350 #define LJ_ARCH_NUMMODE		LJ_NUMMODE_DUAL
    351 
    352 #if _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2
    353 #define LJ_ARCH_VERSION		20
    354 #else
    355 #define LJ_ARCH_VERSION		10
    356 #endif
    357 
    358 #else
    359 #error "No target architecture defined"
    360 #endif
    361 
    362 #ifndef LJ_PAGESIZE
    363 #define LJ_PAGESIZE		4096
    364 #endif
    365 
    366 /* Check for minimum required compiler versions. */
    367 #if defined(__GNUC__)
    368 #if LJ_TARGET_X86
    369 #if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4)
    370 #error "Need at least GCC 3.4 or newer"
    371 #endif
    372 #elif LJ_TARGET_X64
    373 #if __GNUC__ < 4
    374 #error "Need at least GCC 4.0 or newer"
    375 #endif
    376 #elif LJ_TARGET_ARM
    377 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
    378 #error "Need at least GCC 4.2 or newer"
    379 #endif
    380 #elif LJ_TARGET_ARM64
    381 #if __clang__
    382 #if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)
    383 #error "Need at least Clang 3.5 or newer"
    384 #endif
    385 #else
    386 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8)
    387 #error "Need at least GCC 4.8 or newer"
    388 #endif
    389 #endif
    390 #elif !LJ_TARGET_PS3
    391 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3)
    392 #error "Need at least GCC 4.3 or newer"
    393 #endif
    394 #endif
    395 #endif
    396 
    397 /* Check target-specific constraints. */
    398 #ifndef _BUILDVM_H
    399 #if LJ_TARGET_X64
    400 #if __USING_SJLJ_EXCEPTIONS__
    401 #error "Need a C compiler with native exception handling on x64"
    402 #endif
    403 #elif LJ_TARGET_ARM
    404 #if defined(__ARMEB__)
    405 #error "No support for big-endian ARM"
    406 #endif
    407 #if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__
    408 #error "No support for Cortex-M CPUs"
    409 #endif
    410 #if !(__ARM_EABI__ || LJ_TARGET_IOS)
    411 #error "Only ARM EABI or iOS 3.0+ ABI is supported"
    412 #endif
    413 #elif LJ_TARGET_ARM64
    414 #if defined(__AARCH64EB__)
    415 #error "No support for big-endian ARM64"
    416 #endif
    417 #if defined(_ILP32)
    418 #error "No support for ILP32 model on ARM64"
    419 #endif
    420 #elif LJ_TARGET_PPC
    421 #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)
    422 #error "No support for PowerPC CPUs without double-precision FPU"
    423 #endif
    424 #if !LJ_ARCH_PPC64 && LJ_ARCH_ENDIAN == LUAJIT_LE
    425 #error "No support for little-endian PPC32"
    426 #endif
    427 #if LJ_ARCH_PPC64
    428 #error "No support for PowerPC 64 bit mode (yet)"
    429 #endif
    430 #ifdef __NO_FPRS__
    431 #error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
    432 #endif
    433 #elif LJ_TARGET_MIPS32
    434 #if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32))
    435 #error "Only o32 ABI supported for MIPS32"
    436 #endif
    437 #elif LJ_TARGET_MIPS64
    438 #if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64))
    439 #error "Only n64 ABI supported for MIPS64"
    440 #endif
    441 #endif
    442 #endif
    443 
    444 /* Enable or disable the dual-number mode for the VM. */
    445 #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \
    446     (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1)
    447 #error "No support for this number mode on this architecture"
    448 #endif
    449 #if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \
    450     (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \
    451     (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2)
    452 #define LJ_DUALNUM		1
    453 #else
    454 #define LJ_DUALNUM		0
    455 #endif
    456 
    457 #if LJ_TARGET_IOS || LJ_TARGET_CONSOLE
    458 /* Runtime code generation is restricted on iOS. Complain to Apple, not me. */
    459 /* Ditto for the consoles. Complain to Sony or MS, not me. */
    460 #ifndef LUAJIT_ENABLE_JIT
    461 #define LJ_OS_NOJIT		1
    462 #endif
    463 #endif
    464 
    465 /* 64 bit GC references. */
    466 #if LJ_TARGET_GC64
    467 #define LJ_GC64			1
    468 #else
    469 #define LJ_GC64			0
    470 #endif
    471 
    472 /* 2-slot frame info. */
    473 #if LJ_GC64
    474 #define LJ_FR2			1
    475 #else
    476 #define LJ_FR2			0
    477 #endif
    478 
    479 /* Disable or enable the JIT compiler. */
    480 #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT)
    481 #define LJ_HASJIT		0
    482 #else
    483 #define LJ_HASJIT		1
    484 #endif
    485 
    486 /* Disable or enable the FFI extension. */
    487 #if ((defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI)) \
    488     && (!defined(LUAJIT_ENABLE_LUA53COMPAT)))
    489 #define LJ_HASFFI		0
    490 #else
    491 #define LJ_HASFFI		1
    492 #endif
    493 
    494 #if defined(LUAJIT_DISABLE_PROFILE)
    495 #define LJ_HASPROFILE		0
    496 #elif LJ_TARGET_POSIX
    497 #define LJ_HASPROFILE		1
    498 #define LJ_PROFILE_SIGPROF	1
    499 #elif LJ_TARGET_PS3
    500 #define LJ_HASPROFILE		1
    501 #define LJ_PROFILE_PTHREAD	1
    502 #elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360
    503 #define LJ_HASPROFILE		1
    504 #define LJ_PROFILE_WTHREAD	1
    505 #else
    506 #define LJ_HASPROFILE		0
    507 #endif
    508 
    509 #ifndef LJ_ARCH_HASFPU
    510 #define LJ_ARCH_HASFPU		1
    511 #endif
    512 #ifndef LJ_ABI_SOFTFP
    513 #define LJ_ABI_SOFTFP		0
    514 #endif
    515 #define LJ_SOFTFP		(!LJ_ARCH_HASFPU)
    516 
    517 #if LJ_ARCH_ENDIAN == LUAJIT_BE
    518 #define LJ_LE			0
    519 #define LJ_BE			1
    520 #define LJ_ENDIAN_SELECT(le, be)	be
    521 #define LJ_ENDIAN_LOHI(lo, hi)		hi lo
    522 #else
    523 #define LJ_LE			1
    524 #define LJ_BE			0
    525 #define LJ_ENDIAN_SELECT(le, be)	le
    526 #define LJ_ENDIAN_LOHI(lo, hi)		lo hi
    527 #endif
    528 
    529 #if LJ_ARCH_BITS == 32
    530 #define LJ_32			1
    531 #define LJ_64			0
    532 #else
    533 #define LJ_32			0
    534 #define LJ_64			1
    535 #endif
    536 
    537 #ifndef LJ_TARGET_UNALIGNED
    538 #define LJ_TARGET_UNALIGNED	0
    539 #endif
    540 
    541 /* Various workarounds for embedded operating systems or weak C runtimes. */
    542 #if defined(__ANDROID__) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS
    543 #define LUAJIT_NO_LOG2
    544 #endif
    545 #if defined(__symbian__) || LJ_TARGET_WINDOWS
    546 #define LUAJIT_NO_EXP2
    547 #endif
    548 #if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)
    549 #define LJ_NO_SYSTEM		1
    550 #endif
    551 
    552 #if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__
    553 /* NYI: no support for compact unwind specification, yet. */
    554 #define LUAJIT_NO_UNWIND	1
    555 #endif
    556 
    557 #if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4
    558 #define LJ_NO_UNWIND		1
    559 #endif
    560 
    561 /* Compatibility with Lua 5.1 vs. 5.2. */
    562 #ifdef LUAJIT_ENABLE_LUA51COMPAT
    563 #define LJ_51			1
    564 #else
    565 #define LJ_51			0
    566 #endif
    567 
    568 /* Enable Lua 5.3 compatibility. */
    569 #ifdef LUAJIT_ENABLE_LUA53COMPAT
    570 #define LJ_53			1
    571 #else
    572 #define	LJ_53			0
    573 #endif
    574 
    575 /* Enable 4GB memory model */
    576 #ifdef LUAJIT_ENABLE_4GB
    577 #include <malloc.h>
    578 #if !(LJ_64 && !LJ_GC64 && defined(M_MMAP_THRESHOLD))
    579 #error "4GB memory model not supported (need X64, mallopt() and !GC64)"
    580 #endif
    581 #define LJ_4GB                  1
    582 #else
    583 #define LJ_4GB                  0
    584 #endif
    585 
    586 #endif