1*632be62bSalnsn /*	$NetBSD: sljitConfigInternal.h,v 1.11 2019/01/20 23:14:16 alnsn Exp $	*/
2637c186aSalnsn 
30675068dSalnsn /*
40675068dSalnsn  *    Stack-less Just-In-Time compiler
50675068dSalnsn  *
6*632be62bSalnsn  *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
70675068dSalnsn  *
80675068dSalnsn  * Redistribution and use in source and binary forms, with or without modification, are
90675068dSalnsn  * permitted provided that the following conditions are met:
100675068dSalnsn  *
110675068dSalnsn  *   1. Redistributions of source code must retain the above copyright notice, this list of
120675068dSalnsn  *      conditions and the following disclaimer.
130675068dSalnsn  *
140675068dSalnsn  *   2. Redistributions in binary form must reproduce the above copyright notice, this list
150675068dSalnsn  *      of conditions and the following disclaimer in the documentation and/or other materials
160675068dSalnsn  *      provided with the distribution.
170675068dSalnsn  *
180675068dSalnsn  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
190675068dSalnsn  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
200675068dSalnsn  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
210675068dSalnsn  * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
220675068dSalnsn  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
230675068dSalnsn  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
240675068dSalnsn  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
250675068dSalnsn  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
260675068dSalnsn  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
270675068dSalnsn  */
280675068dSalnsn 
290675068dSalnsn #ifndef _SLJIT_CONFIG_INTERNAL_H_
300675068dSalnsn #define _SLJIT_CONFIG_INTERNAL_H_
310675068dSalnsn 
320675068dSalnsn /*
33dfd7d8b1Salnsn    SLJIT defines the following architecture dependent types and macros:
340675068dSalnsn 
35dfd7d8b1Salnsn    Types:
36dfd7d8b1Salnsn      sljit_s8, sljit_u8   : signed and unsigned 8 bit integer type
37dfd7d8b1Salnsn      sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type
38dfd7d8b1Salnsn      sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type
39dfd7d8b1Salnsn      sljit_sw, sljit_uw   : signed and unsigned machine word, enough to store a pointer
40dfd7d8b1Salnsn      sljit_p              : unsgined pointer value (usually the same as sljit_uw, but
41dfd7d8b1Salnsn                             some 64 bit ABIs may use 32 bit pointers)
42dfd7d8b1Salnsn      sljit_f32            : 32 bit single precision floating point value
43dfd7d8b1Salnsn      sljit_f64            : 64 bit double precision floating point value
44dfd7d8b1Salnsn 
45dfd7d8b1Salnsn    Macros for feature detection (boolean):
460675068dSalnsn      SLJIT_32BIT_ARCHITECTURE : 32 bit architecture
470675068dSalnsn      SLJIT_64BIT_ARCHITECTURE : 64 bit architecture
480675068dSalnsn      SLJIT_LITTLE_ENDIAN : little endian architecture
490675068dSalnsn      SLJIT_BIG_ENDIAN : big endian architecture
500675068dSalnsn      SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!)
510675068dSalnsn      SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information
52dfd7d8b1Salnsn 
53dfd7d8b1Salnsn    Constants:
54dfd7d8b1Salnsn      SLJIT_NUMBER_OF_REGISTERS : number of available registers
55dfd7d8b1Salnsn      SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers
56dfd7d8b1Salnsn      SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers
57dfd7d8b1Salnsn      SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers
58dfd7d8b1Salnsn      SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers
59dfd7d8b1Salnsn      SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers
60dfd7d8b1Salnsn      SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index
61dfd7d8b1Salnsn      SLJIT_F32_SHIFT : the shift required to apply when accessing
62dfd7d8b1Salnsn                        a single precision floating point array by index
63dfd7d8b1Salnsn      SLJIT_F64_SHIFT : the shift required to apply when accessing
64dfd7d8b1Salnsn                        a double precision floating point array by index
65dfd7d8b1Salnsn      SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)
6673480e1eSalnsn      SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address
670675068dSalnsn 
68dfd7d8b1Salnsn    Other macros:
690675068dSalnsn      SLJIT_CALL : C calling convention define for both calling JIT form C and C callbacks for JIT
700675068dSalnsn      SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)
710675068dSalnsn */
720675068dSalnsn 
73dfd7d8b1Salnsn /*****************/
74dfd7d8b1Salnsn /* Sanity check. */
75dfd7d8b1Salnsn /*****************/
76dfd7d8b1Salnsn 
770675068dSalnsn #if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
780675068dSalnsn 	|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
790675068dSalnsn 	|| (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
800675068dSalnsn 	|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
810675068dSalnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
8256b25969Salnsn 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
830675068dSalnsn 	|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
840675068dSalnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
850675068dSalnsn 	|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
8656b25969Salnsn 	|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
8773480e1eSalnsn 	|| (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
8856b25969Salnsn 	|| (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \
890675068dSalnsn 	|| (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
900675068dSalnsn 	|| (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED))
910675068dSalnsn #error "An architecture must be selected"
920675068dSalnsn #endif
930675068dSalnsn 
940675068dSalnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
950675068dSalnsn 	+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
960675068dSalnsn 	+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
970675068dSalnsn 	+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
980675068dSalnsn 	+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
9956b25969Salnsn 	+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
1000675068dSalnsn 	+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
1010675068dSalnsn 	+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
10256b25969Salnsn 	+ (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \
1030675068dSalnsn 	+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
10456b25969Salnsn 	+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
10573480e1eSalnsn 	+ (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
1060675068dSalnsn 	+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
1070675068dSalnsn 	+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
1080675068dSalnsn #error "Multiple architectures are selected"
1090675068dSalnsn #endif
1100675068dSalnsn 
111dfd7d8b1Salnsn /********************************************************/
112dfd7d8b1Salnsn /* Automatic CPU detection (requires compiler support). */
113dfd7d8b1Salnsn /********************************************************/
114dfd7d8b1Salnsn 
1150675068dSalnsn #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
1160675068dSalnsn 
1170675068dSalnsn #ifndef _WIN32
1180675068dSalnsn 
1190675068dSalnsn #if defined(__i386__) || defined(__i386)
1200675068dSalnsn #define SLJIT_CONFIG_X86_32 1
1210675068dSalnsn #elif defined(__x86_64__)
1220675068dSalnsn #define SLJIT_CONFIG_X86_64 1
1230675068dSalnsn #elif defined(__arm__) || defined(__ARM__)
1240675068dSalnsn #ifdef __thumb2__
1250675068dSalnsn #define SLJIT_CONFIG_ARM_THUMB2 1
1260675068dSalnsn #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
1270675068dSalnsn #define SLJIT_CONFIG_ARM_V7 1
1280675068dSalnsn #else
1290675068dSalnsn #define SLJIT_CONFIG_ARM_V5 1
1300675068dSalnsn #endif
13156b25969Salnsn #elif defined (__aarch64__)
13256b25969Salnsn #define SLJIT_CONFIG_ARM_64 1
1330675068dSalnsn #elif defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__))
1340675068dSalnsn #define SLJIT_CONFIG_PPC_64 1
1350675068dSalnsn #elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
1360675068dSalnsn #define SLJIT_CONFIG_PPC_32 1
13756b25969Salnsn #elif defined(__mips__) && !defined(_LP64)
1380675068dSalnsn #define SLJIT_CONFIG_MIPS_32 1
13956b25969Salnsn #elif defined(__mips64)
14056b25969Salnsn #define SLJIT_CONFIG_MIPS_64 1
14173480e1eSalnsn #elif defined(__sparc__) || defined(__sparc)
14273480e1eSalnsn #define SLJIT_CONFIG_SPARC_32 1
14356b25969Salnsn #elif defined(__tilegx__)
14456b25969Salnsn #define SLJIT_CONFIG_TILEGX 1
1450675068dSalnsn #else
1460675068dSalnsn /* Unsupported architecture */
1470675068dSalnsn #define SLJIT_CONFIG_UNSUPPORTED 1
1480675068dSalnsn #endif
1490675068dSalnsn 
1500675068dSalnsn #else /* !_WIN32 */
1510675068dSalnsn 
1520675068dSalnsn #if defined(_M_X64) || defined(__x86_64__)
1530675068dSalnsn #define SLJIT_CONFIG_X86_64 1
1540675068dSalnsn #elif defined(_ARM_)
1550675068dSalnsn #define SLJIT_CONFIG_ARM_V5 1
1560675068dSalnsn #else
1570675068dSalnsn #define SLJIT_CONFIG_X86_32 1
1580675068dSalnsn #endif
1590675068dSalnsn 
1600675068dSalnsn #endif /* !WIN32 */
1610675068dSalnsn #endif /* SLJIT_CONFIG_AUTO */
1620675068dSalnsn 
1630675068dSalnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
1640675068dSalnsn #undef SLJIT_EXECUTABLE_ALLOCATOR
1650675068dSalnsn #endif
1660675068dSalnsn 
167dfd7d8b1Salnsn /******************************/
168dfd7d8b1Salnsn /* CPU family type detection. */
169dfd7d8b1Salnsn /******************************/
170dfd7d8b1Salnsn 
171dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
172dfd7d8b1Salnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
173dfd7d8b1Salnsn #define SLJIT_CONFIG_ARM_32 1
174dfd7d8b1Salnsn #endif
175dfd7d8b1Salnsn 
176dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
177dfd7d8b1Salnsn #define SLJIT_CONFIG_X86 1
178dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
179dfd7d8b1Salnsn #define SLJIT_CONFIG_ARM 1
180dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
181dfd7d8b1Salnsn #define SLJIT_CONFIG_PPC 1
182dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
183dfd7d8b1Salnsn #define SLJIT_CONFIG_MIPS 1
184dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) || (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)
185dfd7d8b1Salnsn #define SLJIT_CONFIG_SPARC 1
186dfd7d8b1Salnsn #endif
187dfd7d8b1Salnsn 
188dfd7d8b1Salnsn /**********************************/
189dfd7d8b1Salnsn /* External function definitions. */
190dfd7d8b1Salnsn /**********************************/
191dfd7d8b1Salnsn 
1920675068dSalnsn /* General macros:
1930675068dSalnsn    Note: SLJIT is designed to be independent from them as possible.
1940675068dSalnsn 
195dfd7d8b1Salnsn    In release mode (SLJIT_DEBUG is not defined) only the following
196dfd7d8b1Salnsn    external functions are needed:
1970675068dSalnsn */
1980675068dSalnsn 
1990675068dSalnsn #ifndef SLJIT_MALLOC
200dfd7d8b1Salnsn #define SLJIT_MALLOC(size, allocator_data) malloc(size)
2010675068dSalnsn #endif
2020675068dSalnsn 
2030675068dSalnsn #ifndef SLJIT_FREE
204dfd7d8b1Salnsn #define SLJIT_FREE(ptr, allocator_data) free(ptr)
2050675068dSalnsn #endif
2060675068dSalnsn 
207*632be62bSalnsn #ifndef SLJIT_MEMCPY
208*632be62bSalnsn #define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len)
2090675068dSalnsn #endif
2100675068dSalnsn 
2110675068dSalnsn #ifndef SLJIT_ZEROMEM
2120675068dSalnsn #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
2130675068dSalnsn #endif
2140675068dSalnsn 
215dfd7d8b1Salnsn /***************************/
216dfd7d8b1Salnsn /* Compiler helper macros. */
217dfd7d8b1Salnsn /***************************/
218dfd7d8b1Salnsn 
2190675068dSalnsn #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
2200675068dSalnsn 
2210675068dSalnsn #if defined(__GNUC__) && (__GNUC__ >= 3)
2220675068dSalnsn #define SLJIT_LIKELY(x)		__builtin_expect((x), 1)
2230675068dSalnsn #define SLJIT_UNLIKELY(x)	__builtin_expect((x), 0)
2240675068dSalnsn #else
2250675068dSalnsn #define SLJIT_LIKELY(x)		(x)
2260675068dSalnsn #define SLJIT_UNLIKELY(x)	(x)
2270675068dSalnsn #endif
2280675068dSalnsn 
2290675068dSalnsn #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */
2300675068dSalnsn 
2310675068dSalnsn #ifndef SLJIT_INLINE
23256b25969Salnsn /* Inline functions. Some old compilers do not support them. */
23356b25969Salnsn #if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510
23456b25969Salnsn #define SLJIT_INLINE
23556b25969Salnsn #else
2360675068dSalnsn #define SLJIT_INLINE __inline
2370675068dSalnsn #endif
23856b25969Salnsn #endif /* !SLJIT_INLINE */
2390675068dSalnsn 
240dfd7d8b1Salnsn #ifndef SLJIT_NOINLINE
241dfd7d8b1Salnsn /* Not inline functions. */
242dfd7d8b1Salnsn #if defined(__GNUC__)
243dfd7d8b1Salnsn #define SLJIT_NOINLINE __attribute__ ((noinline))
244dfd7d8b1Salnsn #else
245dfd7d8b1Salnsn #define SLJIT_NOINLINE
2460675068dSalnsn #endif
247dfd7d8b1Salnsn #endif /* !SLJIT_INLINE */
2480675068dSalnsn 
2490675068dSalnsn #ifndef SLJIT_UNUSED_ARG
2500675068dSalnsn /* Unused arguments. */
2510675068dSalnsn #define SLJIT_UNUSED_ARG(arg) (void)arg
2520675068dSalnsn #endif
2530675068dSalnsn 
254dfd7d8b1Salnsn /*********************************/
255dfd7d8b1Salnsn /* Type of public API functions. */
256dfd7d8b1Salnsn /*********************************/
257dfd7d8b1Salnsn 
2580675068dSalnsn #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
2590675068dSalnsn /* Static ABI functions. For all-in-one programs. */
2600675068dSalnsn 
2610675068dSalnsn #if defined(__GNUC__)
2620675068dSalnsn /* Disable unused warnings in gcc. */
2630675068dSalnsn #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))
2640675068dSalnsn #else
2650675068dSalnsn #define SLJIT_API_FUNC_ATTRIBUTE static
2660675068dSalnsn #endif
2670675068dSalnsn 
2680675068dSalnsn #else
2690675068dSalnsn #define SLJIT_API_FUNC_ATTRIBUTE
2700675068dSalnsn #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
2710675068dSalnsn 
272dfd7d8b1Salnsn /****************************/
273dfd7d8b1Salnsn /* Instruction cache flush. */
274dfd7d8b1Salnsn /****************************/
275dfd7d8b1Salnsn 
276dfd7d8b1Salnsn #if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)
277dfd7d8b1Salnsn #if __has_builtin(__builtin___clear_cache)
278dfd7d8b1Salnsn 
279dfd7d8b1Salnsn #define SLJIT_CACHE_FLUSH(from, to) \
280dfd7d8b1Salnsn 	__builtin___clear_cache((char*)from, (char*)to)
281dfd7d8b1Salnsn 
282dfd7d8b1Salnsn #endif /* __has_builtin(__builtin___clear_cache) */
283dfd7d8b1Salnsn #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
284dfd7d8b1Salnsn 
2850675068dSalnsn #ifndef SLJIT_CACHE_FLUSH
2860675068dSalnsn 
287dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
2880675068dSalnsn 
2890675068dSalnsn /* Not required to implement on archs with unified caches. */
2900675068dSalnsn #define SLJIT_CACHE_FLUSH(from, to)
2910675068dSalnsn 
2920675068dSalnsn #elif defined __APPLE__
2930675068dSalnsn 
2940675068dSalnsn /* Supported by all macs since Mac OS 10.5.
2950675068dSalnsn    However, it does not work on non-jailbroken iOS devices,
2960675068dSalnsn    although the compilation is successful. */
2970675068dSalnsn 
2980675068dSalnsn #define SLJIT_CACHE_FLUSH(from, to) \
2990675068dSalnsn 	sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
3000675068dSalnsn 
301*632be62bSalnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
302*632be62bSalnsn 
303*632be62bSalnsn /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
304*632be62bSalnsn #define SLJIT_CACHE_FLUSH(from, to) \
305*632be62bSalnsn 	ppc_cache_flush((from), (to))
306*632be62bSalnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
307*632be62bSalnsn 
308dfd7d8b1Salnsn #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
309dfd7d8b1Salnsn 
310dfd7d8b1Salnsn #define SLJIT_CACHE_FLUSH(from, to) \
311dfd7d8b1Salnsn 	__builtin___clear_cache((char*)from, (char*)to)
312dfd7d8b1Salnsn 
31356b25969Salnsn #elif defined __ANDROID__
31456b25969Salnsn 
31556b25969Salnsn /* Android lacks __clear_cache; instead, cacheflush should be used. */
31656b25969Salnsn 
31756b25969Salnsn #define SLJIT_CACHE_FLUSH(from, to) \
31856b25969Salnsn     cacheflush((long)(from), (long)(to), 0)
31956b25969Salnsn 
32073480e1eSalnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
32173480e1eSalnsn 
32273480e1eSalnsn /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */
32373480e1eSalnsn #define SLJIT_CACHE_FLUSH(from, to) \
32473480e1eSalnsn 	sparc_cache_flush((from), (to))
325dfd7d8b1Salnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
32673480e1eSalnsn 
3270675068dSalnsn #else
3280675068dSalnsn 
3290675068dSalnsn /* Calls __ARM_NR_cacheflush on ARM-Linux. */
3300675068dSalnsn #define SLJIT_CACHE_FLUSH(from, to) \
3310675068dSalnsn 	__clear_cache((char*)(from), (char*)(to))
3320675068dSalnsn 
3330675068dSalnsn #endif
3340675068dSalnsn 
3350675068dSalnsn #endif /* !SLJIT_CACHE_FLUSH */
3360675068dSalnsn 
337dfd7d8b1Salnsn /******************************************************/
338dfd7d8b1Salnsn /*    Integer and floating point type definitions.    */
339dfd7d8b1Salnsn /******************************************************/
340dfd7d8b1Salnsn 
3410675068dSalnsn /* 8 bit byte type. */
342dfd7d8b1Salnsn typedef unsigned char sljit_u8;
343dfd7d8b1Salnsn typedef signed char sljit_s8;
3440675068dSalnsn 
3450675068dSalnsn /* 16 bit half-word type. */
346dfd7d8b1Salnsn typedef unsigned short int sljit_u16;
347dfd7d8b1Salnsn typedef signed short int sljit_s16;
3480675068dSalnsn 
3490675068dSalnsn /* 32 bit integer type. */
350dfd7d8b1Salnsn typedef unsigned int sljit_u32;
351dfd7d8b1Salnsn typedef signed int sljit_s32;
3520675068dSalnsn 
353dfd7d8b1Salnsn /* Machine word type. Enough for storing a pointer.
3540675068dSalnsn      32 bit for 32 bit machines.
3550675068dSalnsn      64 bit for 64 bit machines. */
3560675068dSalnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
3570675068dSalnsn /* Just to have something. */
3580675068dSalnsn #define SLJIT_WORD_SHIFT 0
3590675068dSalnsn typedef unsigned long int sljit_uw;
36056b25969Salnsn typedef long int sljit_sw;
36156b25969Salnsn #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
36256b25969Salnsn 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
36356b25969Salnsn 	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
36456b25969Salnsn 	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
36556b25969Salnsn 	&& !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
3660675068dSalnsn #define SLJIT_32BIT_ARCHITECTURE 1
3670675068dSalnsn #define SLJIT_WORD_SHIFT 2
3680675068dSalnsn typedef unsigned int sljit_uw;
36956b25969Salnsn typedef int sljit_sw;
3700675068dSalnsn #else
3710675068dSalnsn #define SLJIT_64BIT_ARCHITECTURE 1
3720675068dSalnsn #define SLJIT_WORD_SHIFT 3
3730675068dSalnsn #ifdef _WIN32
3740675068dSalnsn typedef unsigned __int64 sljit_uw;
37556b25969Salnsn typedef __int64 sljit_sw;
3760675068dSalnsn #else
3770675068dSalnsn typedef unsigned long int sljit_uw;
37856b25969Salnsn typedef long int sljit_sw;
3790675068dSalnsn #endif
3800675068dSalnsn #endif
3810675068dSalnsn 
38256b25969Salnsn typedef sljit_uw sljit_p;
38356b25969Salnsn 
38456b25969Salnsn /* Floating point types. */
385dfd7d8b1Salnsn typedef float sljit_f32;
386dfd7d8b1Salnsn typedef double sljit_f64;
38756b25969Salnsn 
38856b25969Salnsn /* Shift for pointer sized data. */
38956b25969Salnsn #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT
39056b25969Salnsn 
39156b25969Salnsn /* Shift for double precision sized data. */
392dfd7d8b1Salnsn #define SLJIT_F32_SHIFT 2
393dfd7d8b1Salnsn #define SLJIT_F64_SHIFT 3
3940675068dSalnsn 
3950675068dSalnsn #ifndef SLJIT_W
3960675068dSalnsn 
3970675068dSalnsn /* Defining long constants. */
3980675068dSalnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
3990675068dSalnsn #define SLJIT_W(w)	(w##ll)
4000675068dSalnsn #else
4010675068dSalnsn #define SLJIT_W(w)	(w)
4020675068dSalnsn #endif
4030675068dSalnsn 
4040675068dSalnsn #endif /* !SLJIT_W */
4050675068dSalnsn 
406dfd7d8b1Salnsn /*************************/
407dfd7d8b1Salnsn /* Endianness detection. */
408dfd7d8b1Salnsn /*************************/
4090675068dSalnsn 
4100675068dSalnsn #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
4110675068dSalnsn 
412dfd7d8b1Salnsn /* These macros are mostly useful for the applications. */
41373480e1eSalnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
41456b25969Salnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
4150675068dSalnsn 
41656b25969Salnsn #ifdef __LITTLE_ENDIAN__
41756b25969Salnsn #define SLJIT_LITTLE_ENDIAN 1
41856b25969Salnsn #else
41956b25969Salnsn #define SLJIT_BIG_ENDIAN 1
42056b25969Salnsn #endif
42156b25969Salnsn 
42256b25969Salnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
42356b25969Salnsn 	|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
4240675068dSalnsn 
4250675068dSalnsn #ifdef __MIPSEL__
4260675068dSalnsn #define SLJIT_LITTLE_ENDIAN 1
4270675068dSalnsn #else
4280675068dSalnsn #define SLJIT_BIG_ENDIAN 1
4290675068dSalnsn #endif
4300675068dSalnsn 
43156b25969Salnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
43256b25969Salnsn 
43356b25969Salnsn #define SLJIT_BIG_ENDIAN 1
43456b25969Salnsn 
4350675068dSalnsn #else
4360675068dSalnsn #define SLJIT_LITTLE_ENDIAN 1
4370675068dSalnsn #endif
4380675068dSalnsn 
4390675068dSalnsn #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
4400675068dSalnsn 
4410675068dSalnsn /* Sanity check. */
4420675068dSalnsn #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
4430675068dSalnsn #error "Exactly one endianness must be selected"
4440675068dSalnsn #endif
4450675068dSalnsn 
4460675068dSalnsn #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
4470675068dSalnsn #error "Exactly one endianness must be selected"
4480675068dSalnsn #endif
4490675068dSalnsn 
4500675068dSalnsn #ifndef SLJIT_UNALIGNED
4510675068dSalnsn 
4520675068dSalnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
4530675068dSalnsn 	|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
4540675068dSalnsn 	|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
4550675068dSalnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
45656b25969Salnsn 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
4570675068dSalnsn 	|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
4580675068dSalnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
4590675068dSalnsn #define SLJIT_UNALIGNED 1
4600675068dSalnsn #endif
4610675068dSalnsn 
4620675068dSalnsn #endif /* !SLJIT_UNALIGNED */
4630675068dSalnsn 
464dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
465dfd7d8b1Salnsn /* Auto detect SSE2 support using CPUID.
466dfd7d8b1Salnsn    On 64 bit x86 cpus, sse2 must be present. */
467dfd7d8b1Salnsn #define SLJIT_DETECT_SSE2 1
468dfd7d8b1Salnsn #endif
469dfd7d8b1Salnsn 
470dfd7d8b1Salnsn /*****************************************************************************************/
471dfd7d8b1Salnsn /* Calling convention of functions generated by SLJIT or called from the generated code. */
472dfd7d8b1Salnsn /*****************************************************************************************/
473dfd7d8b1Salnsn 
474dfd7d8b1Salnsn #ifndef SLJIT_CALL
475dfd7d8b1Salnsn 
476dfd7d8b1Salnsn #if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION)
477dfd7d8b1Salnsn 
478dfd7d8b1Salnsn /* Force cdecl. */
479dfd7d8b1Salnsn #define SLJIT_CALL
480dfd7d8b1Salnsn 
481dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
482dfd7d8b1Salnsn 
483dfd7d8b1Salnsn #if defined(__GNUC__) && !defined(__APPLE__)
484dfd7d8b1Salnsn 
485dfd7d8b1Salnsn #define SLJIT_CALL __attribute__ ((fastcall))
486dfd7d8b1Salnsn #define SLJIT_X86_32_FASTCALL 1
487dfd7d8b1Salnsn 
488dfd7d8b1Salnsn #elif defined(_MSC_VER)
489dfd7d8b1Salnsn 
490dfd7d8b1Salnsn #define SLJIT_CALL __fastcall
491dfd7d8b1Salnsn #define SLJIT_X86_32_FASTCALL 1
492dfd7d8b1Salnsn 
493dfd7d8b1Salnsn #elif defined(__BORLANDC__)
494dfd7d8b1Salnsn 
495dfd7d8b1Salnsn #define SLJIT_CALL __msfastcall
496dfd7d8b1Salnsn #define SLJIT_X86_32_FASTCALL 1
497dfd7d8b1Salnsn 
498dfd7d8b1Salnsn #else /* Unknown compiler. */
499dfd7d8b1Salnsn 
500dfd7d8b1Salnsn /* The cdecl attribute is the default. */
501dfd7d8b1Salnsn #define SLJIT_CALL
502dfd7d8b1Salnsn 
503dfd7d8b1Salnsn #endif
504dfd7d8b1Salnsn 
505dfd7d8b1Salnsn #else /* Non x86-32 architectures. */
506dfd7d8b1Salnsn 
507dfd7d8b1Salnsn #define SLJIT_CALL
508dfd7d8b1Salnsn 
509dfd7d8b1Salnsn #endif /* SLJIT_CONFIG_X86_32 */
510dfd7d8b1Salnsn 
511dfd7d8b1Salnsn #endif /* !SLJIT_CALL */
512dfd7d8b1Salnsn 
513dfd7d8b1Salnsn #ifndef SLJIT_INDIRECT_CALL
514dfd7d8b1Salnsn #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
515dfd7d8b1Salnsn 	|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
516dfd7d8b1Salnsn /* It seems certain ppc compilers use an indirect addressing for functions
517dfd7d8b1Salnsn    which makes things complicated. */
518dfd7d8b1Salnsn #define SLJIT_INDIRECT_CALL 1
519dfd7d8b1Salnsn #endif
520dfd7d8b1Salnsn #endif /* SLJIT_INDIRECT_CALL */
521dfd7d8b1Salnsn 
522dfd7d8b1Salnsn /* The offset which needs to be substracted from the return address to
523dfd7d8b1Salnsn determine the next executed instruction after return. */
524dfd7d8b1Salnsn #ifndef SLJIT_RETURN_ADDRESS_OFFSET
525dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
526dfd7d8b1Salnsn #define SLJIT_RETURN_ADDRESS_OFFSET 8
527dfd7d8b1Salnsn #else
528dfd7d8b1Salnsn #define SLJIT_RETURN_ADDRESS_OFFSET 0
529dfd7d8b1Salnsn #endif
530dfd7d8b1Salnsn #endif /* SLJIT_RETURN_ADDRESS_OFFSET */
531dfd7d8b1Salnsn 
532dfd7d8b1Salnsn /***************************************************/
533dfd7d8b1Salnsn /* Functions of the built-in executable allocator. */
534dfd7d8b1Salnsn /***************************************************/
535dfd7d8b1Salnsn 
5360675068dSalnsn #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
5370675068dSalnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
5380675068dSalnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
53956b25969Salnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);
5400675068dSalnsn #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
5410675068dSalnsn #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
542*632be62bSalnsn 
543*632be62bSalnsn #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
544*632be62bSalnsn SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
545*632be62bSalnsn #define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr)
546*632be62bSalnsn #else
547*632be62bSalnsn #define SLJIT_EXEC_OFFSET(ptr) 0
548*632be62bSalnsn #endif
549*632be62bSalnsn 
5500675068dSalnsn #endif
5510675068dSalnsn 
552dfd7d8b1Salnsn /**********************************************/
553dfd7d8b1Salnsn /* Registers and locals offset determination. */
554dfd7d8b1Salnsn /**********************************************/
555dfd7d8b1Salnsn 
556dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
557dfd7d8b1Salnsn 
558*632be62bSalnsn #define SLJIT_NUMBER_OF_REGISTERS 12
559*632be62bSalnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 9
560dfd7d8b1Salnsn #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
561*632be62bSalnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
562dfd7d8b1Salnsn #else
563dfd7d8b1Salnsn /* Maximum 3 arguments are passed on the stack, +1 for double alignment. */
564*632be62bSalnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
565dfd7d8b1Salnsn #endif /* SLJIT_X86_32_FASTCALL */
566dfd7d8b1Salnsn 
567dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
568dfd7d8b1Salnsn 
569dfd7d8b1Salnsn #ifndef _WIN64
570dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 12
571dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
572*632be62bSalnsn #define SLJIT_LOCALS_OFFSET_BASE 0
573dfd7d8b1Salnsn #else
574dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 12
575dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
576*632be62bSalnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
577dfd7d8b1Salnsn #endif /* _WIN64 */
578dfd7d8b1Salnsn 
579dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
580dfd7d8b1Salnsn 
581*632be62bSalnsn #define SLJIT_NUMBER_OF_REGISTERS 12
582dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
583dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE 0
584dfd7d8b1Salnsn 
585dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
586dfd7d8b1Salnsn 
587*632be62bSalnsn #define SLJIT_NUMBER_OF_REGISTERS 12
588*632be62bSalnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
589dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE 0
590dfd7d8b1Salnsn 
591dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
592dfd7d8b1Salnsn 
593dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 25
594dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
595dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw))
596dfd7d8b1Salnsn 
597dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
598dfd7d8b1Salnsn 
599dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 22
600dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
601dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
602dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))
603dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
604dfd7d8b1Salnsn /* Add +1 for double alignment. */
605dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw))
606dfd7d8b1Salnsn #else
607dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw))
608dfd7d8b1Salnsn #endif /* SLJIT_CONFIG_PPC_64 || _AIX */
609dfd7d8b1Salnsn 
610dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
611dfd7d8b1Salnsn 
612*632be62bSalnsn #define SLJIT_NUMBER_OF_REGISTERS 21
613dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
614dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
615dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw))
616dfd7d8b1Salnsn #else
617dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE 0
618dfd7d8b1Salnsn #endif
619dfd7d8b1Salnsn 
620dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
621dfd7d8b1Salnsn 
622dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 18
623dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
624dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
625dfd7d8b1Salnsn /* Add +1 for double alignment. */
626dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw))
627dfd7d8b1Salnsn #endif
628dfd7d8b1Salnsn 
629dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
630dfd7d8b1Salnsn 
631dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 10
632dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 5
633dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE 0
634dfd7d8b1Salnsn 
635dfd7d8b1Salnsn #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
636dfd7d8b1Salnsn 
637dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_REGISTERS 0
638dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
639dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET_BASE 0
640dfd7d8b1Salnsn 
641dfd7d8b1Salnsn #endif
642dfd7d8b1Salnsn 
643dfd7d8b1Salnsn #define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)
644dfd7d8b1Salnsn 
645dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \
646dfd7d8b1Salnsn 	(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)
647dfd7d8b1Salnsn 
648dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6
649dfd7d8b1Salnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)
650dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1
651dfd7d8b1Salnsn #else
652dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
653dfd7d8b1Salnsn #endif
654dfd7d8b1Salnsn 
655dfd7d8b1Salnsn #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
656dfd7d8b1Salnsn 	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
657dfd7d8b1Salnsn 
658dfd7d8b1Salnsn /*************************************/
659dfd7d8b1Salnsn /* Debug and verbose related macros. */
660dfd7d8b1Salnsn /*************************************/
661dfd7d8b1Salnsn 
66256b25969Salnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
66398bc5604Salnsn #ifdef _KERNEL
66498bc5604Salnsn #include <sys/systm.h>
66598bc5604Salnsn #else
6660675068dSalnsn #include <stdio.h>
6670675068dSalnsn #endif
66898bc5604Salnsn #endif
6690675068dSalnsn 
6700675068dSalnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
6710675068dSalnsn 
672*632be62bSalnsn #if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)
67356b25969Salnsn 
67456b25969Salnsn /* SLJIT_HALT_PROCESS must halt the process. */
67556b25969Salnsn #ifndef SLJIT_HALT_PROCESS
676*632be62bSalnsn #ifdef _KERNEL
677*632be62bSalnsn #define SLJIT_HALT_PROCESS() \
678*632be62bSalnsn 	panic("sljit halt");
679*632be62bSalnsn #else
68056b25969Salnsn #include <stdlib.h>
68156b25969Salnsn 
68256b25969Salnsn #define SLJIT_HALT_PROCESS() \
68356b25969Salnsn 	abort();
684*632be62bSalnsn #endif
68556b25969Salnsn #endif /* !SLJIT_HALT_PROCESS */
68656b25969Salnsn 
687*632be62bSalnsn #ifndef _KERNEL
68856b25969Salnsn #include <stdio.h>
689*632be62bSalnsn #endif
69056b25969Salnsn 
691*632be62bSalnsn #endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */
69256b25969Salnsn 
6930675068dSalnsn /* Feel free to redefine these two macros. */
6940675068dSalnsn #ifndef SLJIT_ASSERT
6950675068dSalnsn 
696276a323bSalnsn #include <assert.h>
697276a323bSalnsn #include <stdlib.h>
6980675068dSalnsn 
699276a323bSalnsn #define SLJIT_ASSERT(x) assert(x)
7000675068dSalnsn 
7010675068dSalnsn #endif /* !SLJIT_ASSERT */
7020675068dSalnsn 
703*632be62bSalnsn #ifndef SLJIT_UNREACHABLE
7040675068dSalnsn 
705*632be62bSalnsn #define SLJIT_UNREACHABLE() \
7060675068dSalnsn 	do { \
7070675068dSalnsn 		printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
7080675068dSalnsn 		SLJIT_HALT_PROCESS(); \
7090675068dSalnsn 	} while (0)
7100675068dSalnsn 
711*632be62bSalnsn #endif /* !SLJIT_UNREACHABLE */
7120675068dSalnsn 
7130675068dSalnsn #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
7140675068dSalnsn 
71556b25969Salnsn /* Forcing empty, but valid statements. */
7160675068dSalnsn #undef SLJIT_ASSERT
717*632be62bSalnsn #undef SLJIT_UNREACHABLE
7180675068dSalnsn 
7190675068dSalnsn #define SLJIT_ASSERT(x) \
7200675068dSalnsn 	do { } while (0)
721*632be62bSalnsn #define SLJIT_UNREACHABLE() \
7220675068dSalnsn 	do { } while (0)
7230675068dSalnsn 
7240675068dSalnsn #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
7250675068dSalnsn 
7260675068dSalnsn #ifndef SLJIT_COMPILE_ASSERT
7270675068dSalnsn 
7280675068dSalnsn #define SLJIT_COMPILE_ASSERT(x, description) \
729*632be62bSalnsn 	switch(0) { case 0: case ((x) ? 1 : 0): break; }
7300675068dSalnsn 
7310675068dSalnsn #endif /* !SLJIT_COMPILE_ASSERT */
7320675068dSalnsn 
7330675068dSalnsn #endif
734