Home | History | Annotate | Line # | Download | only in sljit_src
sljitConfigInternal.h revision 1.10
      1  1.10  alnsn /*	$NetBSD: sljitConfigInternal.h,v 1.10 2016/05/29 17:09:33 alnsn Exp $	*/
      2   1.9  alnsn 
      3   1.1  alnsn /*
      4   1.1  alnsn  *    Stack-less Just-In-Time compiler
      5   1.1  alnsn  *
      6   1.1  alnsn  *    Copyright 2009-2012 Zoltan Herczeg (hzmester (at) freemail.hu). All rights reserved.
      7   1.1  alnsn  *
      8   1.1  alnsn  * Redistribution and use in source and binary forms, with or without modification, are
      9   1.1  alnsn  * permitted provided that the following conditions are met:
     10   1.1  alnsn  *
     11   1.1  alnsn  *   1. Redistributions of source code must retain the above copyright notice, this list of
     12   1.1  alnsn  *      conditions and the following disclaimer.
     13   1.1  alnsn  *
     14   1.1  alnsn  *   2. Redistributions in binary form must reproduce the above copyright notice, this list
     15   1.1  alnsn  *      of conditions and the following disclaimer in the documentation and/or other materials
     16   1.1  alnsn  *      provided with the distribution.
     17   1.1  alnsn  *
     18   1.1  alnsn  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
     19   1.1  alnsn  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20   1.1  alnsn  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
     21   1.1  alnsn  * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     22   1.1  alnsn  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
     23   1.1  alnsn  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24   1.1  alnsn  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     25   1.1  alnsn  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     26   1.1  alnsn  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27   1.1  alnsn  */
     28   1.1  alnsn 
     29   1.1  alnsn #ifndef _SLJIT_CONFIG_INTERNAL_H_
     30   1.1  alnsn #define _SLJIT_CONFIG_INTERNAL_H_
     31   1.1  alnsn 
     32   1.1  alnsn /*
     33  1.10  alnsn    SLJIT defines the following architecture dependent types and macros:
     34   1.1  alnsn 
     35  1.10  alnsn    Types:
     36  1.10  alnsn      sljit_s8, sljit_u8   : signed and unsigned 8 bit integer type
     37  1.10  alnsn      sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type
     38  1.10  alnsn      sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type
     39  1.10  alnsn      sljit_sw, sljit_uw   : signed and unsigned machine word, enough to store a pointer
     40  1.10  alnsn      sljit_p              : unsgined pointer value (usually the same as sljit_uw, but
     41  1.10  alnsn                             some 64 bit ABIs may use 32 bit pointers)
     42  1.10  alnsn      sljit_f32            : 32 bit single precision floating point value
     43  1.10  alnsn      sljit_f64            : 64 bit double precision floating point value
     44  1.10  alnsn 
     45  1.10  alnsn    Macros for feature detection (boolean):
     46  1.10  alnsn      SLJIT_32BIT_ARCHITECTURE : 32 bit architecture
     47  1.10  alnsn      SLJIT_64BIT_ARCHITECTURE : 64 bit architecture
     48  1.10  alnsn      SLJIT_LITTLE_ENDIAN : little endian architecture
     49  1.10  alnsn      SLJIT_BIG_ENDIAN : big endian architecture
     50  1.10  alnsn      SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!)
     51  1.10  alnsn      SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information
     52  1.10  alnsn 
     53  1.10  alnsn    Constants:
     54  1.10  alnsn      SLJIT_NUMBER_OF_REGISTERS : number of available registers
     55  1.10  alnsn      SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers
     56  1.10  alnsn      SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers
     57  1.10  alnsn      SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers
     58  1.10  alnsn      SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers
     59  1.10  alnsn      SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers
     60  1.10  alnsn      SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index
     61  1.10  alnsn      SLJIT_F32_SHIFT : the shift required to apply when accessing
     62  1.10  alnsn                        a single precision floating point array by index
     63  1.10  alnsn      SLJIT_F64_SHIFT : the shift required to apply when accessing
     64  1.10  alnsn                        a double precision floating point array by index
     65  1.10  alnsn      SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)
     66  1.10  alnsn      SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address
     67  1.10  alnsn 
     68  1.10  alnsn    Other macros:
     69  1.10  alnsn      SLJIT_CALL : C calling convention define for both calling JIT form C and C callbacks for JIT
     70  1.10  alnsn      SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)
     71   1.1  alnsn */
     72   1.1  alnsn 
     73  1.10  alnsn /*****************/
     74  1.10  alnsn /* Sanity check. */
     75  1.10  alnsn /*****************/
     76  1.10  alnsn 
     77   1.1  alnsn #if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
     78   1.1  alnsn 	|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
     79   1.1  alnsn 	|| (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
     80   1.1  alnsn 	|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
     81   1.1  alnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
     82   1.7  alnsn 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
     83   1.1  alnsn 	|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
     84   1.1  alnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
     85   1.1  alnsn 	|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
     86   1.7  alnsn 	|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
     87   1.4  alnsn 	|| (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
     88   1.7  alnsn 	|| (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \
     89   1.1  alnsn 	|| (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
     90   1.1  alnsn 	|| (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED))
     91   1.1  alnsn #error "An architecture must be selected"
     92   1.1  alnsn #endif
     93   1.1  alnsn 
     94   1.1  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
     95   1.1  alnsn 	+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
     96   1.1  alnsn 	+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
     97   1.1  alnsn 	+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
     98   1.1  alnsn 	+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
     99   1.7  alnsn 	+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
    100   1.1  alnsn 	+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
    101   1.1  alnsn 	+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
    102   1.7  alnsn 	+ (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \
    103   1.1  alnsn 	+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
    104   1.7  alnsn 	+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
    105   1.4  alnsn 	+ (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \
    106   1.1  alnsn 	+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \
    107   1.1  alnsn 	+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2
    108   1.1  alnsn #error "Multiple architectures are selected"
    109   1.1  alnsn #endif
    110   1.1  alnsn 
    111  1.10  alnsn /********************************************************/
    112  1.10  alnsn /* Automatic CPU detection (requires compiler support). */
    113  1.10  alnsn /********************************************************/
    114  1.10  alnsn 
    115   1.1  alnsn #if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
    116   1.1  alnsn 
    117   1.1  alnsn #ifndef _WIN32
    118   1.1  alnsn 
    119   1.1  alnsn #if defined(__i386__) || defined(__i386)
    120   1.1  alnsn #define SLJIT_CONFIG_X86_32 1
    121   1.1  alnsn #elif defined(__x86_64__)
    122   1.1  alnsn #define SLJIT_CONFIG_X86_64 1
    123   1.1  alnsn #elif defined(__arm__) || defined(__ARM__)
    124   1.1  alnsn #ifdef __thumb2__
    125   1.1  alnsn #define SLJIT_CONFIG_ARM_THUMB2 1
    126   1.1  alnsn #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
    127   1.1  alnsn #define SLJIT_CONFIG_ARM_V7 1
    128   1.1  alnsn #else
    129   1.1  alnsn #define SLJIT_CONFIG_ARM_V5 1
    130   1.1  alnsn #endif
    131   1.7  alnsn #elif defined (__aarch64__)
    132   1.7  alnsn #define SLJIT_CONFIG_ARM_64 1
    133   1.1  alnsn #elif defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__))
    134   1.1  alnsn #define SLJIT_CONFIG_PPC_64 1
    135   1.1  alnsn #elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)
    136   1.1  alnsn #define SLJIT_CONFIG_PPC_32 1
    137   1.7  alnsn #elif defined(__mips__) && !defined(_LP64)
    138   1.1  alnsn #define SLJIT_CONFIG_MIPS_32 1
    139   1.7  alnsn #elif defined(__mips64)
    140   1.7  alnsn #define SLJIT_CONFIG_MIPS_64 1
    141   1.4  alnsn #elif defined(__sparc__) || defined(__sparc)
    142   1.4  alnsn #define SLJIT_CONFIG_SPARC_32 1
    143   1.7  alnsn #elif defined(__tilegx__)
    144   1.7  alnsn #define SLJIT_CONFIG_TILEGX 1
    145   1.1  alnsn #else
    146   1.1  alnsn /* Unsupported architecture */
    147   1.1  alnsn #define SLJIT_CONFIG_UNSUPPORTED 1
    148   1.1  alnsn #endif
    149   1.1  alnsn 
    150   1.1  alnsn #else /* !_WIN32 */
    151   1.1  alnsn 
    152   1.1  alnsn #if defined(_M_X64) || defined(__x86_64__)
    153   1.1  alnsn #define SLJIT_CONFIG_X86_64 1
    154   1.1  alnsn #elif defined(_ARM_)
    155   1.1  alnsn #define SLJIT_CONFIG_ARM_V5 1
    156   1.1  alnsn #else
    157   1.1  alnsn #define SLJIT_CONFIG_X86_32 1
    158   1.1  alnsn #endif
    159   1.1  alnsn 
    160   1.1  alnsn #endif /* !WIN32 */
    161   1.1  alnsn #endif /* SLJIT_CONFIG_AUTO */
    162   1.1  alnsn 
    163   1.1  alnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
    164   1.1  alnsn #undef SLJIT_EXECUTABLE_ALLOCATOR
    165   1.1  alnsn #endif
    166   1.1  alnsn 
    167  1.10  alnsn /******************************/
    168  1.10  alnsn /* CPU family type detection. */
    169  1.10  alnsn /******************************/
    170  1.10  alnsn 
    171  1.10  alnsn #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
    172  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
    173  1.10  alnsn #define SLJIT_CONFIG_ARM_32 1
    174  1.10  alnsn #endif
    175  1.10  alnsn 
    176  1.10  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
    177  1.10  alnsn #define SLJIT_CONFIG_X86 1
    178  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
    179  1.10  alnsn #define SLJIT_CONFIG_ARM 1
    180  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
    181  1.10  alnsn #define SLJIT_CONFIG_PPC 1
    182  1.10  alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
    183  1.10  alnsn #define SLJIT_CONFIG_MIPS 1
    184  1.10  alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) || (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)
    185  1.10  alnsn #define SLJIT_CONFIG_SPARC 1
    186  1.10  alnsn #endif
    187  1.10  alnsn 
    188  1.10  alnsn /**********************************/
    189  1.10  alnsn /* External function definitions. */
    190  1.10  alnsn /**********************************/
    191  1.10  alnsn 
    192   1.1  alnsn #if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
    193   1.1  alnsn 
    194   1.2  alnsn #ifndef _KERNEL
    195   1.1  alnsn /* These libraries are needed for the macros below. */
    196   1.1  alnsn #include <stdlib.h>
    197   1.1  alnsn #include <string.h>
    198   1.2  alnsn #endif
    199   1.1  alnsn 
    200  1.10  alnsn #endif /* SLJIT_STD_MACROS_DEFINED */
    201   1.1  alnsn 
    202   1.1  alnsn /* General macros:
    203   1.1  alnsn    Note: SLJIT is designed to be independent from them as possible.
    204   1.1  alnsn 
    205  1.10  alnsn    In release mode (SLJIT_DEBUG is not defined) only the following
    206  1.10  alnsn    external functions are needed:
    207   1.1  alnsn */
    208   1.1  alnsn 
    209   1.1  alnsn #ifndef SLJIT_MALLOC
    210  1.10  alnsn #define SLJIT_MALLOC(size, allocator_data) malloc(size)
    211   1.1  alnsn #endif
    212   1.1  alnsn 
    213   1.1  alnsn #ifndef SLJIT_FREE
    214  1.10  alnsn #define SLJIT_FREE(ptr, allocator_data) free(ptr)
    215   1.1  alnsn #endif
    216   1.1  alnsn 
    217   1.1  alnsn #ifndef SLJIT_MEMMOVE
    218   1.1  alnsn #define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len)
    219   1.1  alnsn #endif
    220   1.1  alnsn 
    221   1.1  alnsn #ifndef SLJIT_ZEROMEM
    222   1.1  alnsn #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
    223   1.1  alnsn #endif
    224   1.1  alnsn 
    225  1.10  alnsn /***************************/
    226  1.10  alnsn /* Compiler helper macros. */
    227  1.10  alnsn /***************************/
    228  1.10  alnsn 
    229   1.1  alnsn #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
    230   1.1  alnsn 
    231   1.1  alnsn #if defined(__GNUC__) && (__GNUC__ >= 3)
    232   1.1  alnsn #define SLJIT_LIKELY(x)		__builtin_expect((x), 1)
    233   1.1  alnsn #define SLJIT_UNLIKELY(x)	__builtin_expect((x), 0)
    234   1.1  alnsn #else
    235   1.1  alnsn #define SLJIT_LIKELY(x)		(x)
    236   1.1  alnsn #define SLJIT_UNLIKELY(x)	(x)
    237   1.1  alnsn #endif
    238   1.1  alnsn 
    239   1.1  alnsn #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */
    240   1.1  alnsn 
    241   1.1  alnsn #ifndef SLJIT_INLINE
    242   1.7  alnsn /* Inline functions. Some old compilers do not support them. */
    243   1.7  alnsn #if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510
    244   1.7  alnsn #define SLJIT_INLINE
    245   1.7  alnsn #else
    246   1.1  alnsn #define SLJIT_INLINE __inline
    247   1.1  alnsn #endif
    248   1.7  alnsn #endif /* !SLJIT_INLINE */
    249   1.1  alnsn 
    250  1.10  alnsn #ifndef SLJIT_NOINLINE
    251  1.10  alnsn /* Not inline functions. */
    252  1.10  alnsn #if defined(__GNUC__)
    253  1.10  alnsn #define SLJIT_NOINLINE __attribute__ ((noinline))
    254  1.10  alnsn #else
    255  1.10  alnsn #define SLJIT_NOINLINE
    256   1.1  alnsn #endif
    257  1.10  alnsn #endif /* !SLJIT_INLINE */
    258   1.1  alnsn 
    259   1.1  alnsn #ifndef SLJIT_UNUSED_ARG
    260   1.1  alnsn /* Unused arguments. */
    261   1.1  alnsn #define SLJIT_UNUSED_ARG(arg) (void)arg
    262   1.1  alnsn #endif
    263   1.1  alnsn 
    264  1.10  alnsn /*********************************/
    265  1.10  alnsn /* Type of public API functions. */
    266  1.10  alnsn /*********************************/
    267  1.10  alnsn 
    268   1.1  alnsn #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
    269   1.1  alnsn /* Static ABI functions. For all-in-one programs. */
    270   1.1  alnsn 
    271   1.1  alnsn #if defined(__GNUC__)
    272   1.1  alnsn /* Disable unused warnings in gcc. */
    273   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))
    274   1.1  alnsn #else
    275   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE static
    276   1.1  alnsn #endif
    277   1.1  alnsn 
    278   1.1  alnsn #else
    279   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE
    280   1.1  alnsn #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
    281   1.1  alnsn 
    282  1.10  alnsn /****************************/
    283  1.10  alnsn /* Instruction cache flush. */
    284  1.10  alnsn /****************************/
    285  1.10  alnsn 
    286  1.10  alnsn #if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)
    287  1.10  alnsn #if __has_builtin(__builtin___clear_cache)
    288  1.10  alnsn 
    289  1.10  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    290  1.10  alnsn 	__builtin___clear_cache((char*)from, (char*)to)
    291  1.10  alnsn 
    292  1.10  alnsn #endif /* __has_builtin(__builtin___clear_cache) */
    293  1.10  alnsn #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
    294  1.10  alnsn 
    295   1.1  alnsn #ifndef SLJIT_CACHE_FLUSH
    296   1.1  alnsn 
    297  1.10  alnsn #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
    298   1.1  alnsn 
    299   1.1  alnsn /* Not required to implement on archs with unified caches. */
    300   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to)
    301   1.1  alnsn 
    302   1.1  alnsn #elif defined __APPLE__
    303   1.1  alnsn 
    304   1.1  alnsn /* Supported by all macs since Mac OS 10.5.
    305   1.1  alnsn    However, it does not work on non-jailbroken iOS devices,
    306   1.1  alnsn    although the compilation is successful. */
    307   1.1  alnsn 
    308   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    309   1.1  alnsn 	sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
    310   1.1  alnsn 
    311  1.10  alnsn #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
    312  1.10  alnsn 
    313  1.10  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    314  1.10  alnsn 	__builtin___clear_cache((char*)from, (char*)to)
    315  1.10  alnsn 
    316   1.7  alnsn #elif defined __ANDROID__
    317   1.7  alnsn 
    318   1.7  alnsn /* Android lacks __clear_cache; instead, cacheflush should be used. */
    319   1.7  alnsn 
    320   1.7  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    321   1.7  alnsn     cacheflush((long)(from), (long)(to), 0)
    322   1.7  alnsn 
    323  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
    324   1.1  alnsn 
    325   1.1  alnsn /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
    326   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    327   1.1  alnsn 	ppc_cache_flush((from), (to))
    328  1.10  alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
    329   1.1  alnsn 
    330   1.4  alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    331   1.4  alnsn 
    332   1.4  alnsn /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */
    333   1.4  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    334   1.4  alnsn 	sparc_cache_flush((from), (to))
    335  1.10  alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
    336   1.4  alnsn 
    337   1.1  alnsn #else
    338   1.1  alnsn 
    339   1.1  alnsn /* Calls __ARM_NR_cacheflush on ARM-Linux. */
    340   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    341   1.1  alnsn 	__clear_cache((char*)(from), (char*)(to))
    342   1.1  alnsn 
    343   1.1  alnsn #endif
    344   1.1  alnsn 
    345   1.1  alnsn #endif /* !SLJIT_CACHE_FLUSH */
    346   1.1  alnsn 
    347  1.10  alnsn /******************************************************/
    348  1.10  alnsn /*    Integer and floating point type definitions.    */
    349  1.10  alnsn /******************************************************/
    350  1.10  alnsn 
    351   1.1  alnsn /* 8 bit byte type. */
    352  1.10  alnsn typedef unsigned char sljit_u8;
    353  1.10  alnsn typedef signed char sljit_s8;
    354   1.1  alnsn 
    355   1.1  alnsn /* 16 bit half-word type. */
    356  1.10  alnsn typedef unsigned short int sljit_u16;
    357  1.10  alnsn typedef signed short int sljit_s16;
    358   1.1  alnsn 
    359   1.1  alnsn /* 32 bit integer type. */
    360  1.10  alnsn typedef unsigned int sljit_u32;
    361  1.10  alnsn typedef signed int sljit_s32;
    362   1.1  alnsn 
    363  1.10  alnsn /* Machine word type. Enough for storing a pointer.
    364   1.1  alnsn      32 bit for 32 bit machines.
    365   1.1  alnsn      64 bit for 64 bit machines. */
    366   1.1  alnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
    367   1.1  alnsn /* Just to have something. */
    368   1.1  alnsn #define SLJIT_WORD_SHIFT 0
    369   1.1  alnsn typedef unsigned long int sljit_uw;
    370   1.7  alnsn typedef long int sljit_sw;
    371   1.7  alnsn #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
    372   1.7  alnsn 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
    373   1.7  alnsn 	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
    374   1.7  alnsn 	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
    375   1.7  alnsn 	&& !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
    376   1.1  alnsn #define SLJIT_32BIT_ARCHITECTURE 1
    377   1.1  alnsn #define SLJIT_WORD_SHIFT 2
    378   1.1  alnsn typedef unsigned int sljit_uw;
    379   1.7  alnsn typedef int sljit_sw;
    380   1.1  alnsn #else
    381   1.1  alnsn #define SLJIT_64BIT_ARCHITECTURE 1
    382   1.1  alnsn #define SLJIT_WORD_SHIFT 3
    383   1.1  alnsn #ifdef _WIN32
    384   1.1  alnsn typedef unsigned __int64 sljit_uw;
    385   1.7  alnsn typedef __int64 sljit_sw;
    386   1.1  alnsn #else
    387   1.1  alnsn typedef unsigned long int sljit_uw;
    388   1.7  alnsn typedef long int sljit_sw;
    389   1.1  alnsn #endif
    390   1.1  alnsn #endif
    391   1.1  alnsn 
    392   1.7  alnsn typedef sljit_uw sljit_p;
    393   1.7  alnsn 
    394   1.7  alnsn /* Floating point types. */
    395  1.10  alnsn typedef float sljit_f32;
    396  1.10  alnsn typedef double sljit_f64;
    397   1.7  alnsn 
    398   1.7  alnsn /* Shift for pointer sized data. */
    399   1.7  alnsn #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT
    400   1.7  alnsn 
    401   1.7  alnsn /* Shift for double precision sized data. */
    402  1.10  alnsn #define SLJIT_F32_SHIFT 2
    403  1.10  alnsn #define SLJIT_F64_SHIFT 3
    404   1.1  alnsn 
    405   1.1  alnsn #ifndef SLJIT_W
    406   1.1  alnsn 
    407   1.1  alnsn /* Defining long constants. */
    408   1.1  alnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
    409   1.1  alnsn #define SLJIT_W(w)	(w##ll)
    410   1.1  alnsn #else
    411   1.1  alnsn #define SLJIT_W(w)	(w)
    412   1.1  alnsn #endif
    413   1.1  alnsn 
    414   1.1  alnsn #endif /* !SLJIT_W */
    415   1.1  alnsn 
    416  1.10  alnsn /*************************/
    417  1.10  alnsn /* Endianness detection. */
    418  1.10  alnsn /*************************/
    419   1.1  alnsn 
    420   1.1  alnsn #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
    421   1.1  alnsn 
    422  1.10  alnsn /* These macros are mostly useful for the applications. */
    423   1.4  alnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
    424   1.7  alnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
    425   1.7  alnsn 
    426   1.7  alnsn #ifdef __LITTLE_ENDIAN__
    427   1.7  alnsn #define SLJIT_LITTLE_ENDIAN 1
    428   1.7  alnsn #else
    429   1.1  alnsn #define SLJIT_BIG_ENDIAN 1
    430   1.7  alnsn #endif
    431   1.1  alnsn 
    432   1.7  alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
    433   1.7  alnsn 	|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
    434   1.1  alnsn 
    435   1.1  alnsn #ifdef __MIPSEL__
    436   1.1  alnsn #define SLJIT_LITTLE_ENDIAN 1
    437   1.1  alnsn #else
    438   1.1  alnsn #define SLJIT_BIG_ENDIAN 1
    439   1.1  alnsn #endif
    440   1.1  alnsn 
    441   1.7  alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    442   1.7  alnsn 
    443   1.7  alnsn #define SLJIT_BIG_ENDIAN 1
    444   1.7  alnsn 
    445   1.1  alnsn #else
    446   1.1  alnsn #define SLJIT_LITTLE_ENDIAN 1
    447   1.1  alnsn #endif
    448   1.1  alnsn 
    449   1.1  alnsn #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
    450   1.1  alnsn 
    451   1.1  alnsn /* Sanity check. */
    452   1.1  alnsn #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
    453   1.1  alnsn #error "Exactly one endianness must be selected"
    454   1.1  alnsn #endif
    455   1.1  alnsn 
    456   1.1  alnsn #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
    457   1.1  alnsn #error "Exactly one endianness must be selected"
    458   1.1  alnsn #endif
    459   1.1  alnsn 
    460  1.10  alnsn #ifndef SLJIT_UNALIGNED
    461  1.10  alnsn 
    462  1.10  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
    463  1.10  alnsn 	|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
    464  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
    465  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
    466  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
    467  1.10  alnsn 	|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
    468  1.10  alnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
    469  1.10  alnsn #define SLJIT_UNALIGNED 1
    470  1.10  alnsn #endif
    471  1.10  alnsn 
    472  1.10  alnsn #endif /* !SLJIT_UNALIGNED */
    473  1.10  alnsn 
    474  1.10  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    475  1.10  alnsn /* Auto detect SSE2 support using CPUID.
    476  1.10  alnsn    On 64 bit x86 cpus, sse2 must be present. */
    477  1.10  alnsn #define SLJIT_DETECT_SSE2 1
    478  1.10  alnsn #endif
    479  1.10  alnsn 
    480  1.10  alnsn /*****************************************************************************************/
    481  1.10  alnsn /* Calling convention of functions generated by SLJIT or called from the generated code. */
    482  1.10  alnsn /*****************************************************************************************/
    483  1.10  alnsn 
    484  1.10  alnsn #ifndef SLJIT_CALL
    485  1.10  alnsn 
    486  1.10  alnsn #if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION)
    487  1.10  alnsn 
    488  1.10  alnsn /* Force cdecl. */
    489  1.10  alnsn #define SLJIT_CALL
    490  1.10  alnsn 
    491  1.10  alnsn #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    492  1.10  alnsn 
    493  1.10  alnsn #if defined(__GNUC__) && !defined(__APPLE__)
    494  1.10  alnsn 
    495  1.10  alnsn #define SLJIT_CALL __attribute__ ((fastcall))
    496  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    497  1.10  alnsn 
    498  1.10  alnsn #elif defined(_MSC_VER)
    499  1.10  alnsn 
    500  1.10  alnsn #define SLJIT_CALL __fastcall
    501  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    502  1.10  alnsn 
    503  1.10  alnsn #elif defined(__BORLANDC__)
    504  1.10  alnsn 
    505  1.10  alnsn #define SLJIT_CALL __msfastcall
    506  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    507  1.10  alnsn 
    508  1.10  alnsn #else /* Unknown compiler. */
    509  1.10  alnsn 
    510  1.10  alnsn /* The cdecl attribute is the default. */
    511  1.10  alnsn #define SLJIT_CALL
    512  1.10  alnsn 
    513  1.10  alnsn #endif
    514  1.10  alnsn 
    515  1.10  alnsn #else /* Non x86-32 architectures. */
    516  1.10  alnsn 
    517  1.10  alnsn #define SLJIT_CALL
    518  1.10  alnsn 
    519  1.10  alnsn #endif /* SLJIT_CONFIG_X86_32 */
    520  1.10  alnsn 
    521  1.10  alnsn #endif /* !SLJIT_CALL */
    522  1.10  alnsn 
    523   1.4  alnsn #ifndef SLJIT_INDIRECT_CALL
    524   1.7  alnsn #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
    525   1.7  alnsn 	|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
    526   1.1  alnsn /* It seems certain ppc compilers use an indirect addressing for functions
    527   1.1  alnsn    which makes things complicated. */
    528   1.1  alnsn #define SLJIT_INDIRECT_CALL 1
    529   1.1  alnsn #endif
    530   1.4  alnsn #endif /* SLJIT_INDIRECT_CALL */
    531   1.4  alnsn 
    532  1.10  alnsn /* The offset which needs to be substracted from the return address to
    533  1.10  alnsn determine the next executed instruction after return. */
    534   1.4  alnsn #ifndef SLJIT_RETURN_ADDRESS_OFFSET
    535   1.4  alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    536   1.4  alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 8
    537   1.4  alnsn #else
    538   1.4  alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 0
    539   1.4  alnsn #endif
    540   1.4  alnsn #endif /* SLJIT_RETURN_ADDRESS_OFFSET */
    541   1.1  alnsn 
    542  1.10  alnsn /***************************************************/
    543  1.10  alnsn /* Functions of the built-in executable allocator. */
    544  1.10  alnsn /***************************************************/
    545   1.1  alnsn 
    546  1.10  alnsn #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
    547  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
    548  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
    549  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);
    550  1.10  alnsn #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
    551  1.10  alnsn #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
    552  1.10  alnsn #endif
    553  1.10  alnsn 
    554  1.10  alnsn /**********************************************/
    555  1.10  alnsn /* Registers and locals offset determination. */
    556  1.10  alnsn /**********************************************/
    557   1.1  alnsn 
    558   1.1  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    559  1.10  alnsn 
    560  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 10
    561  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
    562  1.10  alnsn #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
    563  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((2 + 4) * sizeof(sljit_sw))
    564  1.10  alnsn #else
    565  1.10  alnsn /* Maximum 3 arguments are passed on the stack, +1 for double alignment. */
    566  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1 + 4) * sizeof(sljit_sw))
    567  1.10  alnsn #endif /* SLJIT_X86_32_FASTCALL */
    568  1.10  alnsn 
    569  1.10  alnsn #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
    570  1.10  alnsn 
    571  1.10  alnsn #ifndef _WIN64
    572  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    573  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
    574  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (sizeof(sljit_sw))
    575  1.10  alnsn #else
    576  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    577  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    578  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((4 + 2) * sizeof(sljit_sw))
    579  1.10  alnsn #endif /* _WIN64 */
    580  1.10  alnsn 
    581  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
    582  1.10  alnsn 
    583  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 11
    584  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    585  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    586  1.10  alnsn 
    587  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
    588  1.10  alnsn 
    589  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 11
    590  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
    591  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    592  1.10  alnsn 
    593  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
    594  1.10  alnsn 
    595  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 25
    596  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
    597  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw))
    598  1.10  alnsn 
    599  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
    600  1.10  alnsn 
    601  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 22
    602  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
    603  1.10  alnsn #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
    604  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))
    605  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
    606  1.10  alnsn /* Add +1 for double alignment. */
    607  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw))
    608  1.10  alnsn #else
    609  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw))
    610  1.10  alnsn #endif /* SLJIT_CONFIG_PPC_64 || _AIX */
    611  1.10  alnsn 
    612  1.10  alnsn #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
    613  1.10  alnsn 
    614  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 17
    615  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    616  1.10  alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
    617  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw))
    618  1.10  alnsn #else
    619  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    620  1.10  alnsn #endif
    621  1.10  alnsn 
    622  1.10  alnsn #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
    623  1.10  alnsn 
    624  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 18
    625  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
    626  1.10  alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    627  1.10  alnsn /* Add +1 for double alignment. */
    628  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw))
    629   1.1  alnsn #endif
    630   1.1  alnsn 
    631  1.10  alnsn #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
    632   1.1  alnsn 
    633  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 10
    634  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 5
    635  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    636   1.1  alnsn 
    637  1.10  alnsn #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
    638  1.10  alnsn 
    639  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 0
    640  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
    641  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    642   1.1  alnsn 
    643   1.1  alnsn #endif
    644   1.1  alnsn 
    645  1.10  alnsn #define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)
    646  1.10  alnsn 
    647  1.10  alnsn #define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \
    648  1.10  alnsn 	(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)
    649   1.1  alnsn 
    650  1.10  alnsn #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6
    651  1.10  alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)
    652  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1
    653  1.10  alnsn #else
    654  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
    655   1.1  alnsn #endif
    656   1.1  alnsn 
    657  1.10  alnsn #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
    658  1.10  alnsn 	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
    659  1.10  alnsn 
    660  1.10  alnsn /*************************************/
    661  1.10  alnsn /* Debug and verbose related macros. */
    662  1.10  alnsn /*************************************/
    663  1.10  alnsn 
    664   1.7  alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
    665   1.3  alnsn #ifdef _KERNEL
    666   1.3  alnsn #include <sys/systm.h>
    667   1.3  alnsn #else
    668   1.1  alnsn #include <stdio.h>
    669   1.1  alnsn #endif
    670   1.3  alnsn #endif
    671   1.1  alnsn 
    672   1.1  alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
    673   1.1  alnsn 
    674   1.7  alnsn #if !defined(SLJIT_ASSERT) || !defined(SLJIT_ASSERT_STOP)
    675   1.7  alnsn 
    676   1.7  alnsn /* SLJIT_HALT_PROCESS must halt the process. */
    677   1.7  alnsn #ifndef SLJIT_HALT_PROCESS
    678   1.7  alnsn #include <stdlib.h>
    679   1.7  alnsn 
    680   1.7  alnsn #define SLJIT_HALT_PROCESS() \
    681   1.7  alnsn 	abort();
    682   1.7  alnsn #endif /* !SLJIT_HALT_PROCESS */
    683   1.7  alnsn 
    684   1.7  alnsn #include <stdio.h>
    685   1.7  alnsn 
    686   1.7  alnsn #endif /* !SLJIT_ASSERT || !SLJIT_ASSERT_STOP */
    687   1.7  alnsn 
    688   1.1  alnsn /* Feel free to redefine these two macros. */
    689   1.1  alnsn #ifndef SLJIT_ASSERT
    690   1.1  alnsn 
    691   1.5  alnsn #include <assert.h>
    692   1.5  alnsn #include <stdlib.h>
    693   1.1  alnsn 
    694   1.5  alnsn #define SLJIT_ASSERT(x) assert(x)
    695   1.1  alnsn 
    696   1.1  alnsn #endif /* !SLJIT_ASSERT */
    697   1.1  alnsn 
    698   1.1  alnsn #ifndef SLJIT_ASSERT_STOP
    699   1.1  alnsn 
    700   1.1  alnsn #define SLJIT_ASSERT_STOP() \
    701   1.1  alnsn 	do { \
    702   1.1  alnsn 		printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
    703   1.1  alnsn 		SLJIT_HALT_PROCESS(); \
    704   1.1  alnsn 	} while (0)
    705   1.1  alnsn 
    706   1.1  alnsn #endif /* !SLJIT_ASSERT_STOP */
    707   1.1  alnsn 
    708   1.1  alnsn #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
    709   1.1  alnsn 
    710   1.7  alnsn /* Forcing empty, but valid statements. */
    711   1.1  alnsn #undef SLJIT_ASSERT
    712   1.1  alnsn #undef SLJIT_ASSERT_STOP
    713   1.1  alnsn 
    714   1.1  alnsn #define SLJIT_ASSERT(x) \
    715   1.1  alnsn 	do { } while (0)
    716   1.1  alnsn #define SLJIT_ASSERT_STOP() \
    717   1.1  alnsn 	do { } while (0)
    718   1.1  alnsn 
    719   1.1  alnsn #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
    720   1.1  alnsn 
    721   1.1  alnsn #ifndef SLJIT_COMPILE_ASSERT
    722   1.1  alnsn 
    723   1.1  alnsn /* Should be improved eventually. */
    724   1.1  alnsn #define SLJIT_COMPILE_ASSERT(x, description) \
    725   1.1  alnsn 	SLJIT_ASSERT(x)
    726   1.1  alnsn 
    727   1.1  alnsn #endif /* !SLJIT_COMPILE_ASSERT */
    728   1.1  alnsn 
    729   1.1  alnsn #endif
    730