root/lj_def.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. lj_fls
  2. lj_bswap
  3. lj_bswap64
  4. lj_bswap
  5. lj_bswap64
  6. lj_bswap
  7. lj_bswap64
  8. lj_bswap64
  9. lj_bswap
  10. lj_bswap64
  11. lj_getu16
  12. lj_getu32
  13. lj_fls
  14. lj_ffs
  15. lj_fls
  16. lj_getu16
  17. lj_getu32

   1 /*
   2 ** LuaJIT common internal definitions.
   3 ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
   4 */
   5 
   6 #ifndef _LJ_DEF_H
   7 #define _LJ_DEF_H
   8 
   9 #include "lua.h"
  10 
  11 #if defined(_MSC_VER)
  12 /* MSVC is stuck in the last century and doesn't have C99's stdint.h. */
  13 typedef __int8 int8_t;
  14 typedef __int16 int16_t;
  15 typedef __int32 int32_t;
  16 typedef __int64 int64_t;
  17 typedef unsigned __int8 uint8_t;
  18 typedef unsigned __int16 uint16_t;
  19 typedef unsigned __int32 uint32_t;
  20 typedef unsigned __int64 uint64_t;
  21 #ifdef _WIN64
  22 typedef __int64 intptr_t;
  23 typedef unsigned __int64 uintptr_t;
  24 #else
  25 typedef __int32 intptr_t;
  26 typedef unsigned __int32 uintptr_t;
  27 #endif
  28 #elif defined(__symbian__)
  29 /* Cough. */
  30 typedef signed char int8_t;
  31 typedef short int int16_t;
  32 typedef int int32_t;
  33 typedef long long int64_t;
  34 typedef unsigned char uint8_t;
  35 typedef unsigned short int uint16_t;
  36 typedef unsigned int uint32_t;
  37 typedef unsigned long long uint64_t;
  38 typedef int intptr_t;
  39 typedef unsigned int uintptr_t;
  40 #else
  41 #include <stdint.h>
  42 #endif
  43 
  44 /* Needed everywhere. */
  45 #include <string.h>
  46 #include <stdlib.h>
  47 
  48 /* Various VM limits. */
  49 #define LJ_MAX_MEM32    0x7fffff00      /* Max. 32 bit memory allocation. */
  50 #define LJ_MAX_MEM64    ((uint64_t)1<<47)  /* Max. 64 bit memory allocation. */
  51 /* Max. total memory allocation. */
  52 #define LJ_MAX_MEM      (LJ_GC64 ? LJ_MAX_MEM64 : LJ_MAX_MEM32)
  53 #define LJ_MAX_ALLOC    LJ_MAX_MEM      /* Max. individual allocation length. */
  54 #define LJ_MAX_STR      LJ_MAX_MEM32    /* Max. string length. */
  55 #define LJ_MAX_BUF      LJ_MAX_MEM32    /* Max. buffer length. */
  56 #define LJ_MAX_UDATA    LJ_MAX_MEM32    /* Max. userdata length. */
  57 
  58 #define LJ_MAX_STRTAB   (1<<26)         /* Max. string table size. */
  59 #define LJ_MAX_HBITS    26              /* Max. hash bits. */
  60 #define LJ_MAX_ABITS    28              /* Max. bits of array key. */
  61 #define LJ_MAX_ASIZE    ((1<<(LJ_MAX_ABITS-1))+1)  /* Max. array part size. */
  62 #define LJ_MAX_COLOSIZE 16              /* Max. elems for colocated array. */
  63 
  64 #define LJ_MAX_LINE     LJ_MAX_MEM32    /* Max. source code line number. */
  65 #define LJ_MAX_XLEVEL   200             /* Max. syntactic nesting level. */
  66 #define LJ_MAX_BCINS    (1<<26)         /* Max. # of bytecode instructions. */
  67 #define LJ_MAX_SLOTS    250             /* Max. # of slots in a Lua func. */
  68 #define LJ_MAX_LOCVAR   200             /* Max. # of local variables. */
  69 #define LJ_MAX_UPVAL    60              /* Max. # of upvalues. */
  70 
  71 #define LJ_MAX_IDXCHAIN 100             /* __index/__newindex chain limit. */
  72 #define LJ_STACK_EXTRA  (5+2*LJ_FR2)    /* Extra stack space (metamethods). */
  73 
  74 #define LJ_NUM_CBPAGE   1               /* Number of FFI callback pages. */
  75 
  76 /* Minimum table/buffer sizes. */
  77 #define LJ_MIN_GLOBAL   6               /* Min. global table size (hbits). */
  78 #define LJ_MIN_REGISTRY 2               /* Min. registry size (hbits). */
  79 #define LJ_MIN_STRTAB   256             /* Min. string table size (pow2). */
  80 #define LJ_MIN_SBUF     32              /* Min. string buffer length. */
  81 #define LJ_MIN_VECSZ    8               /* Min. size for growable vectors. */
  82 #define LJ_MIN_IRSZ     32              /* Min. size for growable IR. */
  83 
  84 /* JIT compiler limits. */
  85 #define LJ_MAX_JSLOTS   250             /* Max. # of stack slots for a trace. */
  86 #define LJ_MAX_PHI      64              /* Max. # of PHIs for a loop. */
  87 #define LJ_MAX_EXITSTUBGR       16      /* Max. # of exit stub groups. */
  88 
  89 /* Various macros. */
  90 #ifndef UNUSED
  91 #define UNUSED(x)       ((void)(x))     /* to avoid warnings */
  92 #endif
  93 
  94 #define U64x(hi, lo)    (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo)
  95 #define i32ptr(p)       ((int32_t)(intptr_t)(void *)(p))
  96 #define u32ptr(p)       ((uint32_t)(intptr_t)(void *)(p))
  97 #define i64ptr(p)       ((int64_t)(intptr_t)(void *)(p))
  98 #define u64ptr(p)       ((uint64_t)(intptr_t)(void *)(p))
  99 #define igcptr(p)       (LJ_GC64 ? i64ptr(p) : i32ptr(p))
 100 
 101 #define checki8(x)      ((x) == (int32_t)(int8_t)(x))
 102 #define checku8(x)      ((x) == (int32_t)(uint8_t)(x))
 103 #define checki16(x)     ((x) == (int32_t)(int16_t)(x))
 104 #define checku16(x)     ((x) == (int32_t)(uint16_t)(x))
 105 #define checki32(x)     ((x) == (int32_t)(x))
 106 #define checku32(x)     ((x) == (uint32_t)(x))
 107 #define checkptr32(x)   ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x))
 108 #define checkptr47(x)   (((uint64_t)(uintptr_t)(x) >> 47) == 0)
 109 #define checkptrGC(x)   (LJ_GC64 ? checkptr47((x)) : LJ_64 ? checkptr32((x)) :1)
 110 
 111 /* Every half-decent C compiler transforms this into a rotate instruction. */
 112 #define lj_rol(x, n)    (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1))))
 113 #define lj_ror(x, n)    (((x)<<(-(int)(n)&(8*sizeof(x)-1))) | ((x)>>(n)))
 114 
 115 /* A really naive Bloom filter. But sufficient for our needs. */
 116 typedef uintptr_t BloomFilter;
 117 #define BLOOM_MASK      (8*sizeof(BloomFilter) - 1)
 118 #define bloombit(x)     ((uintptr_t)1 << ((x) & BLOOM_MASK))
 119 #define bloomset(b, x)  ((b) |= bloombit((x)))
 120 #define bloomtest(b, x) ((b) & bloombit((x)))
 121 
 122 #if defined(__GNUC__) || defined(__psp2__)
 123 
 124 #define LJ_NORET        __attribute__((noreturn))
 125 #define LJ_ALIGN(n)     __attribute__((aligned(n)))
 126 #define LJ_INLINE       inline
 127 #define LJ_AINLINE      inline __attribute__((always_inline))
 128 #define LJ_NOINLINE     __attribute__((noinline))
 129 
 130 #if defined(__ELF__) || defined(__MACH__) || defined(__psp2__)
 131 #if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__))
 132 #define LJ_NOAPI        extern __attribute__((visibility("hidden")))
 133 #endif
 134 #endif
 135 
 136 /* Note: it's only beneficial to use fastcall on x86 and then only for up to
 137 ** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only
 138 ** indirect calls and related tail-called C functions are marked as fastcall.
 139 */
 140 #if defined(__i386__)
 141 #define LJ_FASTCALL     __attribute__((fastcall))
 142 #endif
 143 
 144 #define LJ_LIKELY(x)    __builtin_expect(!!(x), 1)
 145 #define LJ_UNLIKELY(x)  __builtin_expect(!!(x), 0)
 146 
 147 #define lj_ffs(x)       ((uint32_t)__builtin_ctz(x))
 148 /* Don't ask ... */
 149 #if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__))
 150 static LJ_AINLINE uint32_t lj_fls(uint32_t x)
 151 {
 152   uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r;
 153 }
 154 #else
 155 #define lj_fls(x)       ((uint32_t)(__builtin_clz(x)^31))
 156 #endif
 157 
 158 #if defined(__arm__)
 159 static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
 160 {
 161 #if defined(__psp2__)
 162   return __builtin_rev(x);
 163 #else
 164   uint32_t r;
 165 #if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\
 166     __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__
 167   __asm__("rev %0, %1" : "=r" (r) : "r" (x));
 168   return r;
 169 #else
 170 #ifdef __thumb__
 171   r = x ^ lj_ror(x, 16);
 172 #else
 173   __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x));
 174 #endif
 175   return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8);
 176 #endif
 177 #endif
 178 }
 179 
 180 static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
 181 {
 182   return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));
 183 }
 184 #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
 185 static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
 186 {
 187   return (uint32_t)__builtin_bswap32((int32_t)x);
 188 }
 189 
 190 static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
 191 {
 192   return (uint64_t)__builtin_bswap64((int64_t)x);
 193 }
 194 #elif defined(__i386__) || defined(__x86_64__)
 195 static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
 196 {
 197   uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
 198 }
 199 
 200 #if defined(__i386__)
 201 static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
 202 {
 203   return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32));
 204 }
 205 #else
 206 static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
 207 {
 208   uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r;
 209 }
 210 #endif
 211 #else
 212 static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
 213 {
 214   return (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24);
 215 }
 216 
 217 static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)
 218 {
 219   return (uint64_t)lj_bswap((uint32_t)(x >> 32)) |
 220          ((uint64_t)lj_bswap((uint32_t)x) << 32);
 221 }
 222 #endif
 223 
 224 typedef union __attribute__((packed)) Unaligned16 {
 225   uint16_t u;
 226   uint8_t b[2];
 227 } Unaligned16;
 228 
 229 typedef union __attribute__((packed)) Unaligned32 {
 230   uint32_t u;
 231   uint8_t b[4];
 232 } Unaligned32;
 233 
 234 /* Unaligned load of uint16_t. */
 235 static LJ_AINLINE uint16_t lj_getu16(const void *p)
 236 {
 237   return ((const Unaligned16 *)p)->u;
 238 }
 239 
 240 /* Unaligned load of uint32_t. */
 241 static LJ_AINLINE uint32_t lj_getu32(const void *p)
 242 {
 243   return ((const Unaligned32 *)p)->u;
 244 }
 245 
 246 #elif defined(_MSC_VER)
 247 
 248 #define LJ_NORET        __declspec(noreturn)
 249 #define LJ_ALIGN(n)     __declspec(align(n))
 250 #define LJ_INLINE       __inline
 251 #define LJ_AINLINE      __forceinline
 252 #define LJ_NOINLINE     __declspec(noinline)
 253 #if defined(_M_IX86)
 254 #define LJ_FASTCALL     __fastcall
 255 #endif
 256 
 257 #ifdef _M_PPC
 258 unsigned int _CountLeadingZeros(long);
 259 #pragma intrinsic(_CountLeadingZeros)
 260 static LJ_AINLINE uint32_t lj_fls(uint32_t x)
 261 {
 262   return _CountLeadingZeros(x) ^ 31;
 263 }
 264 #else
 265 unsigned char _BitScanForward(uint32_t *, unsigned long);
 266 unsigned char _BitScanReverse(uint32_t *, unsigned long);
 267 #pragma intrinsic(_BitScanForward)
 268 #pragma intrinsic(_BitScanReverse)
 269 
 270 static LJ_AINLINE uint32_t lj_ffs(uint32_t x)
 271 {
 272   uint32_t r; _BitScanForward(&r, x); return r;
 273 }
 274 
 275 static LJ_AINLINE uint32_t lj_fls(uint32_t x)
 276 {
 277   uint32_t r; _BitScanReverse(&r, x); return r;
 278 }
 279 #endif
 280 
 281 unsigned long _byteswap_ulong(unsigned long);
 282 uint64_t _byteswap_uint64(uint64_t);
 283 #define lj_bswap(x)     (_byteswap_ulong((x)))
 284 #define lj_bswap64(x)   (_byteswap_uint64((x)))
 285 
 286 #if defined(_M_PPC) && defined(LUAJIT_NO_UNALIGNED)
 287 /*
 288 ** Replacement for unaligned loads on Xbox 360. Disabled by default since it's
 289 ** usually more costly than the occasional stall when crossing a cache-line.
 290 */
 291 static LJ_AINLINE uint16_t lj_getu16(const void *v)
 292 {
 293   const uint8_t *p = (const uint8_t *)v;
 294   return (uint16_t)((p[0]<<8) | p[1]);
 295 }
 296 static LJ_AINLINE uint32_t lj_getu32(const void *v)
 297 {
 298   const uint8_t *p = (const uint8_t *)v;
 299   return (uint32_t)((p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]);
 300 }
 301 #else
 302 /* Unaligned loads are generally ok on x86/x64. */
 303 #define lj_getu16(p)    (*(uint16_t *)(p))
 304 #define lj_getu32(p)    (*(uint32_t *)(p))
 305 #endif
 306 
 307 #else
 308 #error "missing defines for your compiler"
 309 #endif
 310 
 311 /* Optional defines. */
 312 #ifndef LJ_FASTCALL
 313 #define LJ_FASTCALL
 314 #endif
 315 #ifndef LJ_NORET
 316 #define LJ_NORET
 317 #endif
 318 #ifndef LJ_NOAPI
 319 #define LJ_NOAPI        extern
 320 #endif
 321 #ifndef LJ_LIKELY
 322 #define LJ_LIKELY(x)    (x)
 323 #define LJ_UNLIKELY(x)  (x)
 324 #endif
 325 
 326 /* Attributes for internal functions. */
 327 #define LJ_DATA         LJ_NOAPI
 328 #define LJ_DATADEF
 329 #define LJ_ASMF         LJ_NOAPI
 330 #define LJ_FUNCA        LJ_NOAPI
 331 #if defined(ljamalg_c)
 332 #define LJ_FUNC         static
 333 #else
 334 #define LJ_FUNC         LJ_NOAPI
 335 #endif
 336 #define LJ_FUNC_NORET   LJ_FUNC LJ_NORET
 337 #define LJ_FUNCA_NORET  LJ_FUNCA LJ_NORET
 338 #define LJ_ASMF_NORET   LJ_ASMF LJ_NORET
 339 
 340 /* Runtime assertions. */
 341 #ifdef lua_assert
 342 #define check_exp(c, e)         (lua_assert(c), (e))
 343 #define api_check(l, e)         lua_assert(e)
 344 #else
 345 #define lua_assert(c)           ((void)0)
 346 #define check_exp(c, e)         (e)
 347 #define api_check               luai_apicheck
 348 #endif
 349 
 350 /* Static assertions. */
 351 #define LJ_ASSERT_NAME2(name, line)     name ## line
 352 #define LJ_ASSERT_NAME(line)            LJ_ASSERT_NAME2(lj_assert_, line)
 353 #ifdef __COUNTER__
 354 #define LJ_STATIC_ASSERT(cond) \
 355   extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
 356 #else
 357 #define LJ_STATIC_ASSERT(cond) \
 358   extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1])
 359 #endif
 360 
 361 #endif

/* [<][>][^][v][top][bottom][index][help] */