diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/luajit-2.0/src/lj_def.h | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/libraries/luajit-2.0/src/lj_def.h b/libraries/luajit-2.0/src/lj_def.h new file mode 100644 index 0000000..5d21d58 --- /dev/null +++ b/libraries/luajit-2.0/src/lj_def.h | |||
@@ -0,0 +1,307 @@ | |||
1 | /* | ||
2 | ** LuaJIT common internal definitions. | ||
3 | ** Copyright (C) 2005-2011 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_MEM 0x7fffff00 /* Max. total memory allocation. */ | ||
50 | #define LJ_MAX_ALLOC LJ_MAX_MEM /* Max. individual allocation length. */ | ||
51 | #define LJ_MAX_STR LJ_MAX_MEM /* Max. string length. */ | ||
52 | #define LJ_MAX_UDATA LJ_MAX_MEM /* Max. userdata length. */ | ||
53 | |||
54 | #define LJ_MAX_STRTAB (1<<26) /* Max. string table size. */ | ||
55 | #define LJ_MAX_HBITS 26 /* Max. hash bits. */ | ||
56 | #define LJ_MAX_ABITS 28 /* Max. bits of array key. */ | ||
57 | #define LJ_MAX_ASIZE ((1<<(LJ_MAX_ABITS-1))+1) /* Max. array part size. */ | ||
58 | #define LJ_MAX_COLOSIZE 16 /* Max. elems for colocated array. */ | ||
59 | |||
60 | #define LJ_MAX_LINE LJ_MAX_MEM /* Max. source code line number. */ | ||
61 | #define LJ_MAX_XLEVEL 200 /* Max. syntactic nesting level. */ | ||
62 | #define LJ_MAX_BCINS (1<<26) /* Max. # of bytecode instructions. */ | ||
63 | #define LJ_MAX_SLOTS 250 /* Max. # of slots in a Lua func. */ | ||
64 | #define LJ_MAX_LOCVAR 200 /* Max. # of local variables. */ | ||
65 | #define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */ | ||
66 | |||
67 | #define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */ | ||
68 | #define LJ_STACK_EXTRA 5 /* Extra stack space (metamethods). */ | ||
69 | |||
70 | #define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */ | ||
71 | |||
72 | /* Minimum table/buffer sizes. */ | ||
73 | #define LJ_MIN_GLOBAL 6 /* Min. global table size (hbits). */ | ||
74 | #define LJ_MIN_REGISTRY 2 /* Min. registry size (hbits). */ | ||
75 | #define LJ_MIN_STRTAB 256 /* Min. string table size (pow2). */ | ||
76 | #define LJ_MIN_SBUF 32 /* Min. string buffer length. */ | ||
77 | #define LJ_MIN_VECSZ 8 /* Min. size for growable vectors. */ | ||
78 | #define LJ_MIN_IRSZ 32 /* Min. size for growable IR. */ | ||
79 | #define LJ_MIN_K64SZ 16 /* Min. size for chained K64Array. */ | ||
80 | |||
81 | /* JIT compiler limits. */ | ||
82 | #define LJ_MAX_JSLOTS 250 /* Max. # of stack slots for a trace. */ | ||
83 | #define LJ_MAX_PHI 32 /* Max. # of PHIs for a loop. */ | ||
84 | #define LJ_MAX_EXITSTUBGR 16 /* Max. # of exit stub groups. */ | ||
85 | |||
86 | /* Various macros. */ | ||
87 | #ifndef UNUSED | ||
88 | #define UNUSED(x) ((void)(x)) /* to avoid warnings */ | ||
89 | #endif | ||
90 | |||
91 | #define U64x(hi, lo) (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo) | ||
92 | #define i32ptr(p) ((int32_t)(intptr_t)(void *)(p)) | ||
93 | #define u32ptr(p) ((uint32_t)(intptr_t)(void *)(p)) | ||
94 | |||
95 | #define checki8(x) ((x) == (int32_t)(int8_t)(x)) | ||
96 | #define checku8(x) ((x) == (int32_t)(uint8_t)(x)) | ||
97 | #define checki16(x) ((x) == (int32_t)(int16_t)(x)) | ||
98 | #define checku16(x) ((x) == (int32_t)(uint16_t)(x)) | ||
99 | #define checki32(x) ((x) == (int32_t)(x)) | ||
100 | #define checku32(x) ((x) == (uint32_t)(x)) | ||
101 | #define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) | ||
102 | |||
103 | /* Every half-decent C compiler transforms this into a rotate instruction. */ | ||
104 | #define lj_rol(x, n) (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n)))) | ||
105 | #define lj_ror(x, n) (((x)<<(8*sizeof(x)-(n))) | ((x)>>(n))) | ||
106 | |||
107 | /* A really naive Bloom filter. But sufficient for our needs. */ | ||
108 | typedef uintptr_t BloomFilter; | ||
109 | #define BLOOM_MASK (8*sizeof(BloomFilter) - 1) | ||
110 | #define bloombit(x) ((uintptr_t)1 << ((x) & BLOOM_MASK)) | ||
111 | #define bloomset(b, x) ((b) |= bloombit((x))) | ||
112 | #define bloomtest(b, x) ((b) & bloombit((x))) | ||
113 | |||
114 | #if defined(__GNUC__) | ||
115 | |||
116 | #define LJ_NORET __attribute__((noreturn)) | ||
117 | #define LJ_ALIGN(n) __attribute__((aligned(n))) | ||
118 | #define LJ_INLINE inline | ||
119 | #define LJ_AINLINE inline __attribute__((always_inline)) | ||
120 | #define LJ_NOINLINE __attribute__((noinline)) | ||
121 | |||
122 | #if defined(__ELF__) || defined(__MACH__) | ||
123 | #if !((defined(__sun__) && defined(__svr4__)) || defined(__solaris__)) | ||
124 | #define LJ_NOAPI extern __attribute__((visibility("hidden"))) | ||
125 | #endif | ||
126 | #endif | ||
127 | |||
128 | /* Note: it's only beneficial to use fastcall on x86 and then only for up to | ||
129 | ** two non-FP args. The amalgamated compile covers all LJ_FUNC cases. Only | ||
130 | ** indirect calls and related tail-called C functions are marked as fastcall. | ||
131 | */ | ||
132 | #if defined(__i386__) | ||
133 | #define LJ_FASTCALL __attribute__((fastcall)) | ||
134 | #endif | ||
135 | |||
136 | #define LJ_LIKELY(x) __builtin_expect(!!(x), 1) | ||
137 | #define LJ_UNLIKELY(x) __builtin_expect(!!(x), 0) | ||
138 | |||
139 | #define lj_ffs(x) ((uint32_t)__builtin_ctz(x)) | ||
140 | /* Don't ask ... */ | ||
141 | #if defined(__INTEL_COMPILER) && (defined(__i386__) || defined(__x86_64__)) | ||
142 | static LJ_AINLINE uint32_t lj_fls(uint32_t x) | ||
143 | { | ||
144 | uint32_t r; __asm__("bsrl %1, %0" : "=r" (r) : "rm" (x) : "cc"); return r; | ||
145 | } | ||
146 | #else | ||
147 | #define lj_fls(x) ((uint32_t)(__builtin_clz(x)^31)) | ||
148 | #endif | ||
149 | |||
150 | #if defined(__arm__) | ||
151 | static LJ_AINLINE uint32_t lj_bswap(uint32_t x) | ||
152 | { | ||
153 | uint32_t r; | ||
154 | #if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ | ||
155 | __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ | ||
156 | __asm__("rev %0, %1" : "=r" (r) : "r" (x)); | ||
157 | return r; | ||
158 | #else | ||
159 | #ifdef __thumb__ | ||
160 | r = x ^ lj_ror(x, 16); | ||
161 | #else | ||
162 | __asm__("eor %0, %1, %1, ror #16" : "=r" (r) : "r" (x)); | ||
163 | #endif | ||
164 | return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8); | ||
165 | #endif | ||
166 | } | ||
167 | |||
168 | static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) | ||
169 | { | ||
170 | return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); | ||
171 | } | ||
172 | #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) | ||
173 | static LJ_AINLINE uint32_t lj_bswap(uint32_t x) | ||
174 | { | ||
175 | return (uint32_t)__builtin_bswap32((int32_t)x); | ||
176 | } | ||
177 | |||
178 | static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) | ||
179 | { | ||
180 | return (uint64_t)__builtin_bswap64((int64_t)x); | ||
181 | } | ||
182 | #elif defined(__i386__) || defined(__x86_64__) | ||
183 | static LJ_AINLINE uint32_t lj_bswap(uint32_t x) | ||
184 | { | ||
185 | uint32_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r; | ||
186 | } | ||
187 | |||
188 | #if defined(__i386__) | ||
189 | static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) | ||
190 | { | ||
191 | return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); | ||
192 | } | ||
193 | #else | ||
194 | static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) | ||
195 | { | ||
196 | uint64_t r; __asm__("bswap %0" : "=r" (r) : "0" (x)); return r; | ||
197 | } | ||
198 | #endif | ||
199 | #else | ||
200 | #error "missing define for lj_bswap()" | ||
201 | #endif | ||
202 | |||
203 | typedef union __attribute__((packed)) Unaligned16 { | ||
204 | uint16_t u; | ||
205 | uint8_t b[2]; | ||
206 | } Unaligned16; | ||
207 | |||
208 | typedef union __attribute__((packed)) Unaligned32 { | ||
209 | uint32_t u; | ||
210 | uint8_t b[4]; | ||
211 | } Unaligned32; | ||
212 | |||
213 | /* Unaligned load of uint16_t. */ | ||
214 | static LJ_AINLINE uint16_t lj_getu16(const void *p) | ||
215 | { | ||
216 | return ((const Unaligned16 *)p)->u; | ||
217 | } | ||
218 | |||
219 | /* Unaligned load of uint32_t. */ | ||
220 | static LJ_AINLINE uint32_t lj_getu32(const void *p) | ||
221 | { | ||
222 | return ((const Unaligned32 *)p)->u; | ||
223 | } | ||
224 | |||
225 | #elif defined(_MSC_VER) | ||
226 | |||
227 | #define LJ_NORET __declspec(noreturn) | ||
228 | #define LJ_ALIGN(n) __declspec(align(n)) | ||
229 | #define LJ_INLINE __inline | ||
230 | #define LJ_AINLINE __forceinline | ||
231 | #define LJ_NOINLINE __declspec(noinline) | ||
232 | #if defined(_M_IX86) | ||
233 | #define LJ_FASTCALL __fastcall | ||
234 | #endif | ||
235 | |||
236 | static LJ_AINLINE uint32_t lj_ffs(uint32_t x) | ||
237 | { | ||
238 | uint32_t r; _BitScanForward(&r, x); return r; | ||
239 | } | ||
240 | |||
241 | static LJ_AINLINE uint32_t lj_fls(uint32_t x) | ||
242 | { | ||
243 | uint32_t r; _BitScanReverse(&r, x); return r; | ||
244 | } | ||
245 | |||
246 | #define lj_bswap(x) (_byteswap_ulong((x))) | ||
247 | #define lj_bswap64(x) (_byteswap_uint64((x))) | ||
248 | |||
249 | /* MSVC is only supported on x86/x64, where unaligned loads are always ok. */ | ||
250 | #define lj_getu16(p) (*(uint16_t *)(p)) | ||
251 | #define lj_getu32(p) (*(uint32_t *)(p)) | ||
252 | |||
253 | #else | ||
254 | #error "missing defines for your compiler" | ||
255 | #endif | ||
256 | |||
257 | /* Optional defines. */ | ||
258 | #ifndef LJ_FASTCALL | ||
259 | #define LJ_FASTCALL | ||
260 | #endif | ||
261 | #ifndef LJ_NORET | ||
262 | #define LJ_NORET | ||
263 | #endif | ||
264 | #ifndef LJ_NOAPI | ||
265 | #define LJ_NOAPI extern | ||
266 | #endif | ||
267 | #ifndef LJ_LIKELY | ||
268 | #define LJ_LIKELY(x) (x) | ||
269 | #define LJ_UNLIKELY(x) (x) | ||
270 | #endif | ||
271 | |||
272 | /* Attributes for internal functions. */ | ||
273 | #define LJ_DATA LJ_NOAPI | ||
274 | #define LJ_DATADEF | ||
275 | #define LJ_ASMF LJ_NOAPI | ||
276 | #define LJ_FUNCA LJ_NOAPI | ||
277 | #if defined(ljamalg_c) | ||
278 | #define LJ_FUNC static | ||
279 | #else | ||
280 | #define LJ_FUNC LJ_NOAPI | ||
281 | #endif | ||
282 | #define LJ_FUNC_NORET LJ_FUNC LJ_NORET | ||
283 | #define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET | ||
284 | #define LJ_ASMF_NORET LJ_ASMF LJ_NORET | ||
285 | |||
286 | /* Runtime assertions. */ | ||
287 | #ifdef lua_assert | ||
288 | #define check_exp(c, e) (lua_assert(c), (e)) | ||
289 | #define api_check(l, e) lua_assert(e) | ||
290 | #else | ||
291 | #define lua_assert(c) ((void)0) | ||
292 | #define check_exp(c, e) (e) | ||
293 | #define api_check luai_apicheck | ||
294 | #endif | ||
295 | |||
296 | /* Static assertions. */ | ||
297 | #define LJ_ASSERT_NAME2(name, line) name ## line | ||
298 | #define LJ_ASSERT_NAME(line) LJ_ASSERT_NAME2(lj_assert_, line) | ||
299 | #ifdef __COUNTER__ | ||
300 | #define LJ_STATIC_ASSERT(cond) \ | ||
301 | extern void LJ_ASSERT_NAME(__COUNTER__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) | ||
302 | #else | ||
303 | #define LJ_STATIC_ASSERT(cond) \ | ||
304 | extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) | ||
305 | #endif | ||
306 | |||
307 | #endif | ||