Home | History | Annotate | Line # | Download | only in sljit_src
      1  1.11  alnsn /*	$NetBSD: sljitConfigInternal.h,v 1.11 2019/01/20 23:14:16 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.11  alnsn  *    Copyright 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 /* General macros:
    193   1.1  alnsn    Note: SLJIT is designed to be independent from them as possible.
    194   1.1  alnsn 
    195  1.10  alnsn    In release mode (SLJIT_DEBUG is not defined) only the following
    196  1.10  alnsn    external functions are needed:
    197   1.1  alnsn */
    198   1.1  alnsn 
    199   1.1  alnsn #ifndef SLJIT_MALLOC
    200  1.10  alnsn #define SLJIT_MALLOC(size, allocator_data) malloc(size)
    201   1.1  alnsn #endif
    202   1.1  alnsn 
    203   1.1  alnsn #ifndef SLJIT_FREE
    204  1.10  alnsn #define SLJIT_FREE(ptr, allocator_data) free(ptr)
    205   1.1  alnsn #endif
    206   1.1  alnsn 
    207  1.11  alnsn #ifndef SLJIT_MEMCPY
    208  1.11  alnsn #define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len)
    209   1.1  alnsn #endif
    210   1.1  alnsn 
    211   1.1  alnsn #ifndef SLJIT_ZEROMEM
    212   1.1  alnsn #define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
    213   1.1  alnsn #endif
    214   1.1  alnsn 
    215  1.10  alnsn /***************************/
    216  1.10  alnsn /* Compiler helper macros. */
    217  1.10  alnsn /***************************/
    218  1.10  alnsn 
    219   1.1  alnsn #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
    220   1.1  alnsn 
    221   1.1  alnsn #if defined(__GNUC__) && (__GNUC__ >= 3)
    222   1.1  alnsn #define SLJIT_LIKELY(x)		__builtin_expect((x), 1)
    223   1.1  alnsn #define SLJIT_UNLIKELY(x)	__builtin_expect((x), 0)
    224   1.1  alnsn #else
    225   1.1  alnsn #define SLJIT_LIKELY(x)		(x)
    226   1.1  alnsn #define SLJIT_UNLIKELY(x)	(x)
    227   1.1  alnsn #endif
    228   1.1  alnsn 
    229   1.1  alnsn #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */
    230   1.1  alnsn 
    231   1.1  alnsn #ifndef SLJIT_INLINE
    232   1.7  alnsn /* Inline functions. Some old compilers do not support them. */
    233   1.7  alnsn #if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510
    234   1.7  alnsn #define SLJIT_INLINE
    235   1.7  alnsn #else
    236   1.1  alnsn #define SLJIT_INLINE __inline
    237   1.1  alnsn #endif
    238   1.7  alnsn #endif /* !SLJIT_INLINE */
    239   1.1  alnsn 
    240  1.10  alnsn #ifndef SLJIT_NOINLINE
    241  1.10  alnsn /* Not inline functions. */
    242  1.10  alnsn #if defined(__GNUC__)
    243  1.10  alnsn #define SLJIT_NOINLINE __attribute__ ((noinline))
    244  1.10  alnsn #else
    245  1.10  alnsn #define SLJIT_NOINLINE
    246   1.1  alnsn #endif
    247  1.10  alnsn #endif /* !SLJIT_INLINE */
    248   1.1  alnsn 
    249   1.1  alnsn #ifndef SLJIT_UNUSED_ARG
    250   1.1  alnsn /* Unused arguments. */
    251   1.1  alnsn #define SLJIT_UNUSED_ARG(arg) (void)arg
    252   1.1  alnsn #endif
    253   1.1  alnsn 
    254  1.10  alnsn /*********************************/
    255  1.10  alnsn /* Type of public API functions. */
    256  1.10  alnsn /*********************************/
    257  1.10  alnsn 
    258   1.1  alnsn #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
    259   1.1  alnsn /* Static ABI functions. For all-in-one programs. */
    260   1.1  alnsn 
    261   1.1  alnsn #if defined(__GNUC__)
    262   1.1  alnsn /* Disable unused warnings in gcc. */
    263   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))
    264   1.1  alnsn #else
    265   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE static
    266   1.1  alnsn #endif
    267   1.1  alnsn 
    268   1.1  alnsn #else
    269   1.1  alnsn #define SLJIT_API_FUNC_ATTRIBUTE
    270   1.1  alnsn #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
    271   1.1  alnsn 
    272  1.10  alnsn /****************************/
    273  1.10  alnsn /* Instruction cache flush. */
    274  1.10  alnsn /****************************/
    275  1.10  alnsn 
    276  1.10  alnsn #if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)
    277  1.10  alnsn #if __has_builtin(__builtin___clear_cache)
    278  1.10  alnsn 
    279  1.10  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    280  1.10  alnsn 	__builtin___clear_cache((char*)from, (char*)to)
    281  1.10  alnsn 
    282  1.10  alnsn #endif /* __has_builtin(__builtin___clear_cache) */
    283  1.10  alnsn #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
    284  1.10  alnsn 
    285   1.1  alnsn #ifndef SLJIT_CACHE_FLUSH
    286   1.1  alnsn 
    287  1.10  alnsn #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
    288   1.1  alnsn 
    289   1.1  alnsn /* Not required to implement on archs with unified caches. */
    290   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to)
    291   1.1  alnsn 
    292   1.1  alnsn #elif defined __APPLE__
    293   1.1  alnsn 
    294   1.1  alnsn /* Supported by all macs since Mac OS 10.5.
    295   1.1  alnsn    However, it does not work on non-jailbroken iOS devices,
    296   1.1  alnsn    although the compilation is successful. */
    297   1.1  alnsn 
    298   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    299   1.1  alnsn 	sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
    300   1.1  alnsn 
    301  1.11  alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
    302  1.11  alnsn 
    303  1.11  alnsn /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
    304  1.11  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    305  1.11  alnsn 	ppc_cache_flush((from), (to))
    306  1.11  alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
    307  1.11  alnsn 
    308  1.10  alnsn #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
    309  1.10  alnsn 
    310  1.10  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    311  1.10  alnsn 	__builtin___clear_cache((char*)from, (char*)to)
    312  1.10  alnsn 
    313   1.7  alnsn #elif defined __ANDROID__
    314   1.7  alnsn 
    315   1.7  alnsn /* Android lacks __clear_cache; instead, cacheflush should be used. */
    316   1.7  alnsn 
    317   1.7  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    318   1.7  alnsn     cacheflush((long)(from), (long)(to), 0)
    319   1.7  alnsn 
    320   1.4  alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    321   1.4  alnsn 
    322   1.4  alnsn /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */
    323   1.4  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    324   1.4  alnsn 	sparc_cache_flush((from), (to))
    325  1.10  alnsn #define SLJIT_CACHE_FLUSH_OWN_IMPL 1
    326   1.4  alnsn 
    327   1.1  alnsn #else
    328   1.1  alnsn 
    329   1.1  alnsn /* Calls __ARM_NR_cacheflush on ARM-Linux. */
    330   1.1  alnsn #define SLJIT_CACHE_FLUSH(from, to) \
    331   1.1  alnsn 	__clear_cache((char*)(from), (char*)(to))
    332   1.1  alnsn 
    333   1.1  alnsn #endif
    334   1.1  alnsn 
    335   1.1  alnsn #endif /* !SLJIT_CACHE_FLUSH */
    336   1.1  alnsn 
    337  1.10  alnsn /******************************************************/
    338  1.10  alnsn /*    Integer and floating point type definitions.    */
    339  1.10  alnsn /******************************************************/
    340  1.10  alnsn 
    341   1.1  alnsn /* 8 bit byte type. */
    342  1.10  alnsn typedef unsigned char sljit_u8;
    343  1.10  alnsn typedef signed char sljit_s8;
    344   1.1  alnsn 
    345   1.1  alnsn /* 16 bit half-word type. */
    346  1.10  alnsn typedef unsigned short int sljit_u16;
    347  1.10  alnsn typedef signed short int sljit_s16;
    348   1.1  alnsn 
    349   1.1  alnsn /* 32 bit integer type. */
    350  1.10  alnsn typedef unsigned int sljit_u32;
    351  1.10  alnsn typedef signed int sljit_s32;
    352   1.1  alnsn 
    353  1.10  alnsn /* Machine word type. Enough for storing a pointer.
    354   1.1  alnsn      32 bit for 32 bit machines.
    355   1.1  alnsn      64 bit for 64 bit machines. */
    356   1.1  alnsn #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
    357   1.1  alnsn /* Just to have something. */
    358   1.1  alnsn #define SLJIT_WORD_SHIFT 0
    359   1.1  alnsn typedef unsigned long int sljit_uw;
    360   1.7  alnsn typedef long int sljit_sw;
    361   1.7  alnsn #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
    362   1.7  alnsn 	&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
    363   1.7  alnsn 	&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \
    364   1.7  alnsn 	&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \
    365   1.7  alnsn 	&& !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
    366   1.1  alnsn #define SLJIT_32BIT_ARCHITECTURE 1
    367   1.1  alnsn #define SLJIT_WORD_SHIFT 2
    368   1.1  alnsn typedef unsigned int sljit_uw;
    369   1.7  alnsn typedef int sljit_sw;
    370   1.1  alnsn #else
    371   1.1  alnsn #define SLJIT_64BIT_ARCHITECTURE 1
    372   1.1  alnsn #define SLJIT_WORD_SHIFT 3
    373   1.1  alnsn #ifdef _WIN32
    374   1.1  alnsn typedef unsigned __int64 sljit_uw;
    375   1.7  alnsn typedef __int64 sljit_sw;
    376   1.1  alnsn #else
    377   1.1  alnsn typedef unsigned long int sljit_uw;
    378   1.7  alnsn typedef long int sljit_sw;
    379   1.1  alnsn #endif
    380   1.1  alnsn #endif
    381   1.1  alnsn 
    382   1.7  alnsn typedef sljit_uw sljit_p;
    383   1.7  alnsn 
    384   1.7  alnsn /* Floating point types. */
    385  1.10  alnsn typedef float sljit_f32;
    386  1.10  alnsn typedef double sljit_f64;
    387   1.7  alnsn 
    388   1.7  alnsn /* Shift for pointer sized data. */
    389   1.7  alnsn #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT
    390   1.7  alnsn 
    391   1.7  alnsn /* Shift for double precision sized data. */
    392  1.10  alnsn #define SLJIT_F32_SHIFT 2
    393  1.10  alnsn #define SLJIT_F64_SHIFT 3
    394   1.1  alnsn 
    395   1.1  alnsn #ifndef SLJIT_W
    396   1.1  alnsn 
    397   1.1  alnsn /* Defining long constants. */
    398   1.1  alnsn #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)
    399   1.1  alnsn #define SLJIT_W(w)	(w##ll)
    400   1.1  alnsn #else
    401   1.1  alnsn #define SLJIT_W(w)	(w)
    402   1.1  alnsn #endif
    403   1.1  alnsn 
    404   1.1  alnsn #endif /* !SLJIT_W */
    405   1.1  alnsn 
    406  1.10  alnsn /*************************/
    407  1.10  alnsn /* Endianness detection. */
    408  1.10  alnsn /*************************/
    409   1.1  alnsn 
    410   1.1  alnsn #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
    411   1.1  alnsn 
    412  1.10  alnsn /* These macros are mostly useful for the applications. */
    413   1.4  alnsn #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
    414   1.7  alnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
    415   1.7  alnsn 
    416   1.7  alnsn #ifdef __LITTLE_ENDIAN__
    417   1.7  alnsn #define SLJIT_LITTLE_ENDIAN 1
    418   1.7  alnsn #else
    419   1.1  alnsn #define SLJIT_BIG_ENDIAN 1
    420   1.7  alnsn #endif
    421   1.1  alnsn 
    422   1.7  alnsn #elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \
    423   1.7  alnsn 	|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
    424   1.1  alnsn 
    425   1.1  alnsn #ifdef __MIPSEL__
    426   1.1  alnsn #define SLJIT_LITTLE_ENDIAN 1
    427   1.1  alnsn #else
    428   1.1  alnsn #define SLJIT_BIG_ENDIAN 1
    429   1.1  alnsn #endif
    430   1.1  alnsn 
    431   1.7  alnsn #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    432   1.7  alnsn 
    433   1.7  alnsn #define SLJIT_BIG_ENDIAN 1
    434   1.7  alnsn 
    435   1.1  alnsn #else
    436   1.1  alnsn #define SLJIT_LITTLE_ENDIAN 1
    437   1.1  alnsn #endif
    438   1.1  alnsn 
    439   1.1  alnsn #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */
    440   1.1  alnsn 
    441   1.1  alnsn /* Sanity check. */
    442   1.1  alnsn #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
    443   1.1  alnsn #error "Exactly one endianness must be selected"
    444   1.1  alnsn #endif
    445   1.1  alnsn 
    446   1.1  alnsn #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)
    447   1.1  alnsn #error "Exactly one endianness must be selected"
    448   1.1  alnsn #endif
    449   1.1  alnsn 
    450  1.10  alnsn #ifndef SLJIT_UNALIGNED
    451  1.10  alnsn 
    452  1.10  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
    453  1.10  alnsn 	|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
    454  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \
    455  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \
    456  1.10  alnsn 	|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \
    457  1.10  alnsn 	|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
    458  1.10  alnsn 	|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
    459  1.10  alnsn #define SLJIT_UNALIGNED 1
    460  1.10  alnsn #endif
    461  1.10  alnsn 
    462  1.10  alnsn #endif /* !SLJIT_UNALIGNED */
    463  1.10  alnsn 
    464  1.10  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    465  1.10  alnsn /* Auto detect SSE2 support using CPUID.
    466  1.10  alnsn    On 64 bit x86 cpus, sse2 must be present. */
    467  1.10  alnsn #define SLJIT_DETECT_SSE2 1
    468  1.10  alnsn #endif
    469  1.10  alnsn 
    470  1.10  alnsn /*****************************************************************************************/
    471  1.10  alnsn /* Calling convention of functions generated by SLJIT or called from the generated code. */
    472  1.10  alnsn /*****************************************************************************************/
    473  1.10  alnsn 
    474  1.10  alnsn #ifndef SLJIT_CALL
    475  1.10  alnsn 
    476  1.10  alnsn #if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION)
    477  1.10  alnsn 
    478  1.10  alnsn /* Force cdecl. */
    479  1.10  alnsn #define SLJIT_CALL
    480  1.10  alnsn 
    481  1.10  alnsn #elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    482  1.10  alnsn 
    483  1.10  alnsn #if defined(__GNUC__) && !defined(__APPLE__)
    484  1.10  alnsn 
    485  1.10  alnsn #define SLJIT_CALL __attribute__ ((fastcall))
    486  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    487  1.10  alnsn 
    488  1.10  alnsn #elif defined(_MSC_VER)
    489  1.10  alnsn 
    490  1.10  alnsn #define SLJIT_CALL __fastcall
    491  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    492  1.10  alnsn 
    493  1.10  alnsn #elif defined(__BORLANDC__)
    494  1.10  alnsn 
    495  1.10  alnsn #define SLJIT_CALL __msfastcall
    496  1.10  alnsn #define SLJIT_X86_32_FASTCALL 1
    497  1.10  alnsn 
    498  1.10  alnsn #else /* Unknown compiler. */
    499  1.10  alnsn 
    500  1.10  alnsn /* The cdecl attribute is the default. */
    501  1.10  alnsn #define SLJIT_CALL
    502  1.10  alnsn 
    503  1.10  alnsn #endif
    504  1.10  alnsn 
    505  1.10  alnsn #else /* Non x86-32 architectures. */
    506  1.10  alnsn 
    507  1.10  alnsn #define SLJIT_CALL
    508  1.10  alnsn 
    509  1.10  alnsn #endif /* SLJIT_CONFIG_X86_32 */
    510  1.10  alnsn 
    511  1.10  alnsn #endif /* !SLJIT_CALL */
    512  1.10  alnsn 
    513   1.4  alnsn #ifndef SLJIT_INDIRECT_CALL
    514   1.7  alnsn #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
    515   1.7  alnsn 	|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
    516   1.1  alnsn /* It seems certain ppc compilers use an indirect addressing for functions
    517   1.1  alnsn    which makes things complicated. */
    518   1.1  alnsn #define SLJIT_INDIRECT_CALL 1
    519   1.1  alnsn #endif
    520   1.4  alnsn #endif /* SLJIT_INDIRECT_CALL */
    521   1.4  alnsn 
    522  1.10  alnsn /* The offset which needs to be substracted from the return address to
    523  1.10  alnsn determine the next executed instruction after return. */
    524   1.4  alnsn #ifndef SLJIT_RETURN_ADDRESS_OFFSET
    525   1.4  alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    526   1.4  alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 8
    527   1.4  alnsn #else
    528   1.4  alnsn #define SLJIT_RETURN_ADDRESS_OFFSET 0
    529   1.4  alnsn #endif
    530   1.4  alnsn #endif /* SLJIT_RETURN_ADDRESS_OFFSET */
    531   1.1  alnsn 
    532  1.10  alnsn /***************************************************/
    533  1.10  alnsn /* Functions of the built-in executable allocator. */
    534  1.10  alnsn /***************************************************/
    535   1.1  alnsn 
    536  1.10  alnsn #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
    537  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
    538  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
    539  1.10  alnsn SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);
    540  1.10  alnsn #define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
    541  1.10  alnsn #define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
    542  1.11  alnsn 
    543  1.11  alnsn #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
    544  1.11  alnsn SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
    545  1.11  alnsn #define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr)
    546  1.11  alnsn #else
    547  1.11  alnsn #define SLJIT_EXEC_OFFSET(ptr) 0
    548  1.11  alnsn #endif
    549  1.11  alnsn 
    550  1.10  alnsn #endif
    551  1.10  alnsn 
    552  1.10  alnsn /**********************************************/
    553  1.10  alnsn /* Registers and locals offset determination. */
    554  1.10  alnsn /**********************************************/
    555   1.1  alnsn 
    556   1.1  alnsn #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
    557  1.10  alnsn 
    558  1.11  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    559  1.11  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 9
    560  1.10  alnsn #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
    561  1.11  alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
    562  1.10  alnsn #else
    563  1.10  alnsn /* Maximum 3 arguments are passed on the stack, +1 for double alignment. */
    564  1.11  alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
    565  1.10  alnsn #endif /* SLJIT_X86_32_FASTCALL */
    566  1.10  alnsn 
    567  1.10  alnsn #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
    568  1.10  alnsn 
    569  1.10  alnsn #ifndef _WIN64
    570  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    571  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
    572  1.11  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    573  1.10  alnsn #else
    574  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    575  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    576  1.11  alnsn #define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)
    577  1.10  alnsn #endif /* _WIN64 */
    578  1.10  alnsn 
    579  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
    580  1.10  alnsn 
    581  1.11  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    582  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    583  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    584  1.10  alnsn 
    585  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
    586  1.10  alnsn 
    587  1.11  alnsn #define SLJIT_NUMBER_OF_REGISTERS 12
    588  1.11  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    589  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    590  1.10  alnsn 
    591  1.10  alnsn #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
    592  1.10  alnsn 
    593  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 25
    594  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
    595  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw))
    596  1.10  alnsn 
    597  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
    598  1.10  alnsn 
    599  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 22
    600  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
    601  1.10  alnsn #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
    602  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))
    603  1.10  alnsn #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
    604  1.10  alnsn /* Add +1 for double alignment. */
    605  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw))
    606  1.10  alnsn #else
    607  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw))
    608  1.10  alnsn #endif /* SLJIT_CONFIG_PPC_64 || _AIX */
    609  1.10  alnsn 
    610  1.10  alnsn #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
    611  1.10  alnsn 
    612  1.11  alnsn #define SLJIT_NUMBER_OF_REGISTERS 21
    613  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
    614  1.10  alnsn #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
    615  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw))
    616  1.10  alnsn #else
    617  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    618  1.10  alnsn #endif
    619  1.10  alnsn 
    620  1.10  alnsn #elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
    621  1.10  alnsn 
    622  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 18
    623  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
    624  1.10  alnsn #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
    625  1.10  alnsn /* Add +1 for double alignment. */
    626  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw))
    627   1.1  alnsn #endif
    628   1.1  alnsn 
    629  1.10  alnsn #elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
    630   1.1  alnsn 
    631  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 10
    632  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 5
    633  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    634   1.1  alnsn 
    635  1.10  alnsn #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
    636  1.10  alnsn 
    637  1.10  alnsn #define SLJIT_NUMBER_OF_REGISTERS 0
    638  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
    639  1.10  alnsn #define SLJIT_LOCALS_OFFSET_BASE 0
    640   1.1  alnsn 
    641   1.1  alnsn #endif
    642   1.1  alnsn 
    643  1.10  alnsn #define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)
    644  1.10  alnsn 
    645  1.10  alnsn #define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \
    646  1.10  alnsn 	(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)
    647   1.1  alnsn 
    648  1.10  alnsn #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6
    649  1.10  alnsn #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)
    650  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1
    651  1.10  alnsn #else
    652  1.10  alnsn #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
    653   1.1  alnsn #endif
    654   1.1  alnsn 
    655  1.10  alnsn #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
    656  1.10  alnsn 	(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
    657  1.10  alnsn 
    658  1.10  alnsn /*************************************/
    659  1.10  alnsn /* Debug and verbose related macros. */
    660  1.10  alnsn /*************************************/
    661  1.10  alnsn 
    662   1.7  alnsn #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
    663   1.3  alnsn #ifdef _KERNEL
    664   1.3  alnsn #include <sys/systm.h>
    665   1.3  alnsn #else
    666   1.1  alnsn #include <stdio.h>
    667   1.1  alnsn #endif
    668   1.3  alnsn #endif
    669   1.1  alnsn 
    670   1.1  alnsn #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
    671   1.1  alnsn 
    672  1.11  alnsn #if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)
    673   1.7  alnsn 
    674   1.7  alnsn /* SLJIT_HALT_PROCESS must halt the process. */
    675   1.7  alnsn #ifndef SLJIT_HALT_PROCESS
    676  1.11  alnsn #ifdef _KERNEL
    677  1.11  alnsn #define SLJIT_HALT_PROCESS() \
    678  1.11  alnsn 	panic("sljit halt");
    679  1.11  alnsn #else
    680   1.7  alnsn #include <stdlib.h>
    681   1.7  alnsn 
    682   1.7  alnsn #define SLJIT_HALT_PROCESS() \
    683   1.7  alnsn 	abort();
    684  1.11  alnsn #endif
    685   1.7  alnsn #endif /* !SLJIT_HALT_PROCESS */
    686   1.7  alnsn 
    687  1.11  alnsn #ifndef _KERNEL
    688   1.7  alnsn #include <stdio.h>
    689  1.11  alnsn #endif
    690   1.7  alnsn 
    691  1.11  alnsn #endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */
    692   1.7  alnsn 
    693   1.1  alnsn /* Feel free to redefine these two macros. */
    694   1.1  alnsn #ifndef SLJIT_ASSERT
    695   1.1  alnsn 
    696   1.5  alnsn #include <assert.h>
    697   1.5  alnsn #include <stdlib.h>
    698   1.1  alnsn 
    699   1.5  alnsn #define SLJIT_ASSERT(x) assert(x)
    700   1.1  alnsn 
    701   1.1  alnsn #endif /* !SLJIT_ASSERT */
    702   1.1  alnsn 
    703  1.11  alnsn #ifndef SLJIT_UNREACHABLE
    704   1.1  alnsn 
    705  1.11  alnsn #define SLJIT_UNREACHABLE() \
    706   1.1  alnsn 	do { \
    707   1.1  alnsn 		printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \
    708   1.1  alnsn 		SLJIT_HALT_PROCESS(); \
    709   1.1  alnsn 	} while (0)
    710   1.1  alnsn 
    711  1.11  alnsn #endif /* !SLJIT_UNREACHABLE */
    712   1.1  alnsn 
    713   1.1  alnsn #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
    714   1.1  alnsn 
    715   1.7  alnsn /* Forcing empty, but valid statements. */
    716   1.1  alnsn #undef SLJIT_ASSERT
    717  1.11  alnsn #undef SLJIT_UNREACHABLE
    718   1.1  alnsn 
    719   1.1  alnsn #define SLJIT_ASSERT(x) \
    720   1.1  alnsn 	do { } while (0)
    721  1.11  alnsn #define SLJIT_UNREACHABLE() \
    722   1.1  alnsn 	do { } while (0)
    723   1.1  alnsn 
    724   1.1  alnsn #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */
    725   1.1  alnsn 
    726   1.1  alnsn #ifndef SLJIT_COMPILE_ASSERT
    727   1.1  alnsn 
    728   1.1  alnsn #define SLJIT_COMPILE_ASSERT(x, description) \
    729  1.11  alnsn 	switch(0) { case 0: case ((x) ? 1 : 0): break; }
    730   1.1  alnsn 
    731   1.1  alnsn #endif /* !SLJIT_COMPILE_ASSERT */
    732   1.1  alnsn 
    733   1.1  alnsn #endif
    734