src/lj_arch.h - luajit-2.0-src

Macros defined

Source code

  1. /*
  2. ** Target architecture selection.
  3. ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
  4. */

  5. #ifndef _LJ_ARCH_H
  6. #define _LJ_ARCH_H

  7. #include "lua.h"

  8. /* Target endianess. */
  9. #define LUAJIT_LE        0
  10. #define LUAJIT_BE        1

  11. /* Target architectures. */
  12. #define LUAJIT_ARCH_X86                1
  13. #define LUAJIT_ARCH_x86                1
  14. #define LUAJIT_ARCH_X64                2
  15. #define LUAJIT_ARCH_x64                2
  16. #define LUAJIT_ARCH_ARM                3
  17. #define LUAJIT_ARCH_arm                3
  18. #define LUAJIT_ARCH_ARM64        4
  19. #define LUAJIT_ARCH_arm64        4
  20. #define LUAJIT_ARCH_PPC                5
  21. #define LUAJIT_ARCH_ppc                5
  22. #define LUAJIT_ARCH_MIPS        6
  23. #define LUAJIT_ARCH_mips        6

  24. /* Target OS. */
  25. #define LUAJIT_OS_OTHER                0
  26. #define LUAJIT_OS_WINDOWS        1
  27. #define LUAJIT_OS_LINUX                2
  28. #define LUAJIT_OS_OSX                3
  29. #define LUAJIT_OS_BSD                4
  30. #define LUAJIT_OS_POSIX                5

  31. /* Select native target if no target defined. */
  32. #ifndef LUAJIT_TARGET

  33. #if defined(__i386) || defined(__i386__) || defined(_M_IX86)
  34. #define LUAJIT_TARGET        LUAJIT_ARCH_X86
  35. #elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
  36. #define LUAJIT_TARGET        LUAJIT_ARCH_X64
  37. #elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM)
  38. #define LUAJIT_TARGET        LUAJIT_ARCH_ARM
  39. #elif defined(__aarch64__)
  40. #define LUAJIT_TARGET        LUAJIT_ARCH_ARM64
  41. #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)
  42. #define LUAJIT_TARGET        LUAJIT_ARCH_PPC
  43. #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)
  44. #define LUAJIT_TARGET        LUAJIT_ARCH_MIPS
  45. #else
  46. #error "No support for this architecture (yet)"
  47. #endif

  48. #endif

  49. /* Select native OS if no target OS defined. */
  50. #ifndef LUAJIT_OS

  51. #if defined(_WIN32) && !defined(_XBOX_VER)
  52. #define LUAJIT_OS        LUAJIT_OS_WINDOWS
  53. #elif defined(__linux__)
  54. #define LUAJIT_OS        LUAJIT_OS_LINUX
  55. #elif defined(__MACH__) && defined(__APPLE__)
  56. #define LUAJIT_OS        LUAJIT_OS_OSX
  57. #elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
  58.        defined(__NetBSD__) || defined(__OpenBSD__) || \
  59.        defined(__DragonFly__)) && !defined(__ORBIS__)
  60. #define LUAJIT_OS        LUAJIT_OS_BSD
  61. #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__)
  62. #define LUAJIT_OS        LUAJIT_OS_POSIX
  63. #else
  64. #define LUAJIT_OS        LUAJIT_OS_OTHER
  65. #endif

  66. #endif

  67. /* Set target OS properties. */
  68. #if LUAJIT_OS == LUAJIT_OS_WINDOWS
  69. #define LJ_OS_NAME        "Windows"
  70. #elif LUAJIT_OS == LUAJIT_OS_LINUX
  71. #define LJ_OS_NAME        "Linux"
  72. #elif LUAJIT_OS == LUAJIT_OS_OSX
  73. #define LJ_OS_NAME        "OSX"
  74. #elif LUAJIT_OS == LUAJIT_OS_BSD
  75. #define LJ_OS_NAME        "BSD"
  76. #elif LUAJIT_OS == LUAJIT_OS_POSIX
  77. #define LJ_OS_NAME        "POSIX"
  78. #else
  79. #define LJ_OS_NAME        "Other"
  80. #endif

  81. #define LJ_TARGET_WINDOWS        (LUAJIT_OS == LUAJIT_OS_WINDOWS)
  82. #define LJ_TARGET_LINUX                (LUAJIT_OS == LUAJIT_OS_LINUX)
  83. #define LJ_TARGET_OSX                (LUAJIT_OS == LUAJIT_OS_OSX)
  84. #define LJ_TARGET_IOS                (LJ_TARGET_OSX && (LUAJIT_TARGET == LUAJIT_ARCH_ARM || LUAJIT_TARGET == LUAJIT_ARCH_ARM64))
  85. #define LJ_TARGET_POSIX                (LUAJIT_OS > LUAJIT_OS_WINDOWS)
  86. #define LJ_TARGET_DLOPEN        LJ_TARGET_POSIX

  87. #ifdef __CELLOS_LV2__
  88. #define LJ_TARGET_PS3                1
  89. #define LJ_TARGET_CONSOLE        1
  90. #endif

  91. #ifdef __ORBIS__
  92. #define LJ_TARGET_PS4                1
  93. #define LJ_TARGET_CONSOLE        1
  94. #undef NULL
  95. #define NULL ((void*)0)
  96. #endif

  97. #ifdef __psp2__
  98. #define LJ_TARGET_PSVITA        1
  99. #define LJ_TARGET_CONSOLE        1
  100. #endif

  101. #if _XBOX_VER >= 200
  102. #define LJ_TARGET_XBOX360        1
  103. #define LJ_TARGET_CONSOLE        1
  104. #endif

  105. #define LJ_NUMMODE_SINGLE        0        /* Single-number mode only. */
  106. #define LJ_NUMMODE_SINGLE_DUAL        1        /* Default to single-number mode. */
  107. #define LJ_NUMMODE_DUAL                2        /* Dual-number mode only. */
  108. #define LJ_NUMMODE_DUAL_SINGLE        3        /* Default to dual-number mode. */

  109. /* Set target architecture properties. */
  110. #if LUAJIT_TARGET == LUAJIT_ARCH_X86

  111. #define LJ_ARCH_NAME                "x86"
  112. #define LJ_ARCH_BITS                32
  113. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  114. #if LJ_TARGET_WINDOWS || __CYGWIN__
  115. #define LJ_ABI_WIN                1
  116. #else
  117. #define LJ_ABI_WIN                0
  118. #endif
  119. #define LJ_TARGET_X86                1
  120. #define LJ_TARGET_X86ORX64        1
  121. #define LJ_TARGET_EHRETREG        0
  122. #define LJ_TARGET_MASKSHIFT        1
  123. #define LJ_TARGET_MASKROT        1
  124. #define LJ_TARGET_UNALIGNED        1
  125. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_SINGLE_DUAL

  126. #elif LUAJIT_TARGET == LUAJIT_ARCH_X64

  127. #define LJ_ARCH_NAME                "x64"
  128. #define LJ_ARCH_BITS                64
  129. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  130. #define LJ_ABI_WIN                LJ_TARGET_WINDOWS
  131. #define LJ_TARGET_X64                1
  132. #define LJ_TARGET_X86ORX64        1
  133. #define LJ_TARGET_EHRETREG        0
  134. #define LJ_TARGET_JUMPRANGE        31        /* +-2^31 = +-2GB */
  135. #define LJ_TARGET_MASKSHIFT        1
  136. #define LJ_TARGET_MASKROT        1
  137. #define LJ_TARGET_UNALIGNED        1
  138. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_SINGLE_DUAL

  139. #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM

  140. #define LJ_ARCH_NAME                "arm"
  141. #define LJ_ARCH_BITS                32
  142. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  143. #if !defined(LJ_ARCH_HASFPU) && __SOFTFP__
  144. #define LJ_ARCH_HASFPU                0
  145. #endif
  146. #if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP
  147. #define LJ_ABI_SOFTFP                1
  148. #endif
  149. #define LJ_ABI_EABI                1
  150. #define LJ_TARGET_ARM                1
  151. #define LJ_TARGET_EHRETREG        0
  152. #define LJ_TARGET_JUMPRANGE        25        /* +-2^25 = +-32MB */
  153. #define LJ_TARGET_MASKSHIFT        0
  154. #define LJ_TARGET_MASKROT        1
  155. #define LJ_TARGET_UNIFYROT        2        /* Want only IR_BROR. */
  156. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_DUAL

  157. #if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__
  158. #define LJ_ARCH_VERSION                80
  159. #elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__
  160. #define LJ_ARCH_VERSION                70
  161. #elif __ARM_ARCH_6T2__
  162. #define LJ_ARCH_VERSION                61
  163. #elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__
  164. #define LJ_ARCH_VERSION                60
  165. #else
  166. #define LJ_ARCH_VERSION                50
  167. #endif

  168. #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64

  169. #define LJ_ARCH_NAME                "arm64"
  170. #define LJ_ARCH_BITS                64
  171. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  172. #define LJ_TARGET_ARM64                1
  173. #define LJ_TARGET_EHRETREG        0
  174. #define LJ_TARGET_JUMPRANGE        27        /* +-2^27 = +-128MB */
  175. #define LJ_TARGET_MASKSHIFT        1
  176. #define LJ_TARGET_MASKROT        1
  177. #define LJ_TARGET_UNIFYROT        2        /* Want only IR_BROR. */
  178. #define LJ_TARGET_GC64                1
  179. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_DUAL
  180. #define LJ_ARCH_NOJIT                1        /* NYI */

  181. #define LJ_ARCH_VERSION                80

  182. #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC

  183. #if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
  184. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  185. #else
  186. #define LJ_ARCH_ENDIAN                LUAJIT_BE
  187. #endif

  188. #if _LP64
  189. #define LJ_ARCH_BITS                64
  190. #if LJ_ARCH_ENDIAN == LUAJIT_LE
  191. #define LJ_ARCH_NAME                "ppc64le"
  192. #else
  193. #define LJ_ARCH_NAME                "ppc64"
  194. #endif
  195. #else
  196. #define LJ_ARCH_BITS                32
  197. #define LJ_ARCH_NAME                "ppc"
  198. #endif

  199. #define LJ_TARGET_PPC                1
  200. #define LJ_TARGET_EHRETREG        3
  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        1        /* Want only IR_BROL. */
  205. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_DUAL_SINGLE

  206. #if LJ_TARGET_CONSOLE
  207. #define LJ_ARCH_PPC32ON64        1
  208. #define LJ_ARCH_NOFFI                1
  209. #elif LJ_ARCH_BITS == 64
  210. #define LJ_ARCH_PPC64                1
  211. #define LJ_TARGET_GC64                1
  212. #define LJ_ARCH_NOJIT                1        /* NYI */
  213. #endif

  214. #if _ARCH_PWR7
  215. #define LJ_ARCH_VERSION                70
  216. #elif _ARCH_PWR6
  217. #define LJ_ARCH_VERSION                60
  218. #elif _ARCH_PWR5X
  219. #define LJ_ARCH_VERSION                51
  220. #elif _ARCH_PWR5
  221. #define LJ_ARCH_VERSION                50
  222. #elif _ARCH_PWR4
  223. #define LJ_ARCH_VERSION                40
  224. #else
  225. #define LJ_ARCH_VERSION                0
  226. #endif
  227. #if _ARCH_PPCSQ
  228. #define LJ_ARCH_SQRT                1
  229. #endif
  230. #if _ARCH_PWR5X
  231. #define LJ_ARCH_ROUND                1
  232. #endif
  233. #if __PPU__
  234. #define LJ_ARCH_CELL                1
  235. #endif
  236. #if LJ_TARGET_XBOX360
  237. #define LJ_ARCH_XENON                1
  238. #endif

  239. #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS

  240. #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
  241. #define LJ_ARCH_NAME                "mipsel"
  242. #define LJ_ARCH_ENDIAN                LUAJIT_LE
  243. #else
  244. #define LJ_ARCH_NAME                "mips"
  245. #define LJ_ARCH_ENDIAN                LUAJIT_BE
  246. #endif
  247. #define LJ_ARCH_BITS                32
  248. #define LJ_TARGET_MIPS                1
  249. #define LJ_TARGET_EHRETREG        4
  250. #define LJ_TARGET_JUMPRANGE        27        /* 2*2^27 = 256MB-aligned region */
  251. #define LJ_TARGET_MASKSHIFT        1
  252. #define LJ_TARGET_MASKROT        1
  253. #define LJ_TARGET_UNIFYROT        2        /* Want only IR_BROR. */
  254. #define LJ_ARCH_NUMMODE                LJ_NUMMODE_SINGLE

  255. #if _MIPS_ARCH_MIPS32R2
  256. #define LJ_ARCH_VERSION                20
  257. #else
  258. #define LJ_ARCH_VERSION                10
  259. #endif

  260. #else
  261. #error "No target architecture defined"
  262. #endif

  263. #ifndef LJ_PAGESIZE
  264. #define LJ_PAGESIZE                4096
  265. #endif

  266. /* Check for minimum required compiler versions. */
  267. #if defined(__GNUC__)
  268. #if LJ_TARGET_X86
  269. #if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4)
  270. #error "Need at least GCC 3.4 or newer"
  271. #endif
  272. #elif LJ_TARGET_X64
  273. #if __GNUC__ < 4
  274. #error "Need at least GCC 4.0 or newer"
  275. #endif
  276. #elif LJ_TARGET_ARM
  277. #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
  278. #error "Need at least GCC 4.2 or newer"
  279. #endif
  280. #elif LJ_TARGET_ARM64
  281. #if __clang__
  282. #if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)
  283. #error "Need at least Clang 3.5 or newer"
  284. #endif
  285. #else
  286. #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8)
  287. #error "Need at least GCC 4.8 or newer"
  288. #endif
  289. #endif
  290. #elif !LJ_TARGET_PS3
  291. #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3)
  292. #error "Need at least GCC 4.3 or newer"
  293. #endif
  294. #endif
  295. #endif

  296. /* Check target-specific constraints. */
  297. #ifndef _BUILDVM_H
  298. #if LJ_TARGET_X64
  299. #if __USING_SJLJ_EXCEPTIONS__
  300. #error "Need a C compiler with native exception handling on x64"
  301. #endif
  302. #elif LJ_TARGET_ARM
  303. #if defined(__ARMEB__)
  304. #error "No support for big-endian ARM"
  305. #endif
  306. #if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__
  307. #error "No support for Cortex-M CPUs"
  308. #endif
  309. #if !(__ARM_EABI__ || LJ_TARGET_IOS)
  310. #error "Only ARM EABI or iOS 3.0+ ABI is supported"
  311. #endif
  312. #elif LJ_TARGET_ARM64
  313. #if defined(__AARCH64EB__)
  314. #error "No support for big-endian ARM64"
  315. #endif
  316. #if defined(_ILP32)
  317. #error "No support for ILP32 model on ARM64"
  318. #endif
  319. #elif LJ_TARGET_PPC
  320. #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)
  321. #error "No support for PowerPC CPUs without double-precision FPU"
  322. #endif
  323. #if !LJ_ARCH_PPC64 && LJ_ARCH_ENDIAN == LUAJIT_LE
  324. #error "No support for little-endian PPC32"
  325. #endif
  326. #if LJ_ARCH_PPC64
  327. #error "No support for PowerPC 64 bit mode (yet)"
  328. #endif
  329. #ifdef __NO_FPRS__
  330. #error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
  331. #endif
  332. #elif LJ_TARGET_MIPS
  333. #if defined(__mips_soft_float)
  334. #error "No support for MIPS CPUs without FPU"
  335. #endif
  336. #if defined(_LP64)
  337. #error "No support for MIPS64"
  338. #endif
  339. #endif
  340. #endif

  341. /* Enable or disable the dual-number mode for the VM. */
  342. #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \
  343.     (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1)
  344. #error "No support for this number mode on this architecture"
  345. #endif
  346. #if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \
  347.     (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \
  348.     (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2)
  349. #define LJ_DUALNUM                1
  350. #else
  351. #define LJ_DUALNUM                0
  352. #endif

  353. #if LJ_TARGET_IOS || LJ_TARGET_CONSOLE
  354. /* Runtime code generation is restricted on iOS. Complain to Apple, not me. */
  355. /* Ditto for the consoles. Complain to Sony or MS, not me. */
  356. #ifndef LUAJIT_ENABLE_JIT
  357. #define LJ_OS_NOJIT                1
  358. #endif
  359. #endif

  360. /* 64 bit GC references. */
  361. #if LJ_TARGET_GC64
  362. #define LJ_GC64                        1
  363. #else
  364. #define LJ_GC64                        0
  365. #endif

  366. /* 2-slot frame info. */
  367. #if LJ_GC64
  368. #define LJ_FR2                        1
  369. #else
  370. #define LJ_FR2                        0
  371. #endif

  372. /* Disable or enable the JIT compiler. */
  373. #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) || LJ_FR2 || LJ_GC64
  374. #define LJ_HASJIT                0
  375. #else
  376. #define LJ_HASJIT                1
  377. #endif

  378. /* Disable or enable the FFI extension. */
  379. #if defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI)
  380. #define LJ_HASFFI                0
  381. #else
  382. #define LJ_HASFFI                1
  383. #endif

  384. #if defined(LUAJIT_DISABLE_PROFILE)
  385. #define LJ_HASPROFILE                0
  386. #elif LJ_TARGET_POSIX
  387. #define LJ_HASPROFILE                1
  388. #define LJ_PROFILE_SIGPROF        1
  389. #elif LJ_TARGET_PS3
  390. #define LJ_HASPROFILE                1
  391. #define LJ_PROFILE_PTHREAD        1
  392. #elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360
  393. #define LJ_HASPROFILE                1
  394. #define LJ_PROFILE_WTHREAD        1
  395. #else
  396. #define LJ_HASPROFILE                0
  397. #endif

  398. #ifndef LJ_ARCH_HASFPU
  399. #define LJ_ARCH_HASFPU                1
  400. #endif
  401. #ifndef LJ_ABI_SOFTFP
  402. #define LJ_ABI_SOFTFP                0
  403. #endif
  404. #define LJ_SOFTFP                (!LJ_ARCH_HASFPU)

  405. #if LJ_ARCH_ENDIAN == LUAJIT_BE
  406. #define LJ_LE                        0
  407. #define LJ_BE                        1
  408. #define LJ_ENDIAN_SELECT(le, be)        be
  409. #define LJ_ENDIAN_LOHI(lo, hi)                hi lo
  410. #else
  411. #define LJ_LE                        1
  412. #define LJ_BE                        0
  413. #define LJ_ENDIAN_SELECT(le, be)        le
  414. #define LJ_ENDIAN_LOHI(lo, hi)                lo hi
  415. #endif

  416. #if LJ_ARCH_BITS == 32
  417. #define LJ_32                        1
  418. #define LJ_64                        0
  419. #else
  420. #define LJ_32                        0
  421. #define LJ_64                        1
  422. #endif

  423. #ifndef LJ_TARGET_UNALIGNED
  424. #define LJ_TARGET_UNALIGNED        0
  425. #endif

  426. /* Various workarounds for embedded operating systems or weak C runtimes. */
  427. #if (defined(__ANDROID__) && !defined(LJ_TARGET_X86ORX64)) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS
  428. #define LUAJIT_NO_LOG2
  429. #endif
  430. #if defined(__symbian__) || LJ_TARGET_WINDOWS
  431. #define LUAJIT_NO_EXP2
  432. #endif

  433. #if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3
  434. #define LJ_NO_UNWIND                1
  435. #endif

  436. /* Compatibility with Lua 5.1 vs. 5.2. */
  437. #ifdef LUAJIT_ENABLE_LUA52COMPAT
  438. #define LJ_52                        1
  439. #else
  440. #define LJ_52                        0
  441. #endif

  442. #endif