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