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