1*22dc650dSSadaf Ebrahimi /* 2*22dc650dSSadaf Ebrahimi * Stack-less Just-In-Time compiler 3*22dc650dSSadaf Ebrahimi * 4*22dc650dSSadaf Ebrahimi * Copyright Zoltan Herczeg ([email protected]). All rights reserved. 5*22dc650dSSadaf Ebrahimi * 6*22dc650dSSadaf Ebrahimi * Redistribution and use in source and binary forms, with or without modification, are 7*22dc650dSSadaf Ebrahimi * permitted provided that the following conditions are met: 8*22dc650dSSadaf Ebrahimi * 9*22dc650dSSadaf Ebrahimi * 1. Redistributions of source code must retain the above copyright notice, this list of 10*22dc650dSSadaf Ebrahimi * conditions and the following disclaimer. 11*22dc650dSSadaf Ebrahimi * 12*22dc650dSSadaf Ebrahimi * 2. Redistributions in binary form must reproduce the above copyright notice, this list 13*22dc650dSSadaf Ebrahimi * of conditions and the following disclaimer in the documentation and/or other materials 14*22dc650dSSadaf Ebrahimi * provided with the distribution. 15*22dc650dSSadaf Ebrahimi * 16*22dc650dSSadaf Ebrahimi * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY 17*22dc650dSSadaf Ebrahimi * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*22dc650dSSadaf Ebrahimi * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 19*22dc650dSSadaf Ebrahimi * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20*22dc650dSSadaf Ebrahimi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 21*22dc650dSSadaf Ebrahimi * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 22*22dc650dSSadaf Ebrahimi * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23*22dc650dSSadaf Ebrahimi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24*22dc650dSSadaf Ebrahimi * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*22dc650dSSadaf Ebrahimi */ 26*22dc650dSSadaf Ebrahimi 27*22dc650dSSadaf Ebrahimi #ifndef SLJIT_CONFIG_INTERNAL_H_ 28*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_INTERNAL_H_ 29*22dc650dSSadaf Ebrahimi 30*22dc650dSSadaf Ebrahimi #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ 31*22dc650dSSadaf Ebrahimi || (defined SLJIT_DEBUG && SLJIT_DEBUG && (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE))) 32*22dc650dSSadaf Ebrahimi #include <stdio.h> 33*22dc650dSSadaf Ebrahimi #endif 34*22dc650dSSadaf Ebrahimi 35*22dc650dSSadaf Ebrahimi #if (defined SLJIT_DEBUG && SLJIT_DEBUG \ 36*22dc650dSSadaf Ebrahimi && (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) || !defined(SLJIT_HALT_PROCESS))) 37*22dc650dSSadaf Ebrahimi #include <stdlib.h> 38*22dc650dSSadaf Ebrahimi #endif 39*22dc650dSSadaf Ebrahimi 40*22dc650dSSadaf Ebrahimi #ifdef __cplusplus 41*22dc650dSSadaf Ebrahimi extern "C" { 42*22dc650dSSadaf Ebrahimi #endif 43*22dc650dSSadaf Ebrahimi 44*22dc650dSSadaf Ebrahimi /* 45*22dc650dSSadaf Ebrahimi SLJIT defines the following architecture dependent types and macros: 46*22dc650dSSadaf Ebrahimi 47*22dc650dSSadaf Ebrahimi Types: 48*22dc650dSSadaf Ebrahimi sljit_s8, sljit_u8 : signed and unsigned 8 bit integer type 49*22dc650dSSadaf Ebrahimi sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type 50*22dc650dSSadaf Ebrahimi sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type 51*22dc650dSSadaf Ebrahimi sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer 52*22dc650dSSadaf Ebrahimi sljit_sp, sljit_up : signed and unsigned pointer value (usually the same as 53*22dc650dSSadaf Ebrahimi sljit_uw, but some 64 bit ABIs may use 32 bit pointers) 54*22dc650dSSadaf Ebrahimi sljit_f32 : 32 bit single precision floating point value 55*22dc650dSSadaf Ebrahimi sljit_f64 : 64 bit double precision floating point value 56*22dc650dSSadaf Ebrahimi 57*22dc650dSSadaf Ebrahimi Macros for feature detection (boolean): 58*22dc650dSSadaf Ebrahimi SLJIT_32BIT_ARCHITECTURE : 32 bit architecture 59*22dc650dSSadaf Ebrahimi SLJIT_64BIT_ARCHITECTURE : 64 bit architecture 60*22dc650dSSadaf Ebrahimi SLJIT_LITTLE_ENDIAN : little endian architecture 61*22dc650dSSadaf Ebrahimi SLJIT_BIG_ENDIAN : big endian architecture 62*22dc650dSSadaf Ebrahimi SLJIT_UNALIGNED : unaligned memory accesses for non-fpu operations are supported 63*22dc650dSSadaf Ebrahimi SLJIT_FPU_UNALIGNED : unaligned memory accesses for fpu operations are supported 64*22dc650dSSadaf Ebrahimi SLJIT_MASKED_SHIFT : all word shifts are always masked 65*22dc650dSSadaf Ebrahimi SLJIT_MASKED_SHIFT32 : all 32 bit shifts are always masked 66*22dc650dSSadaf Ebrahimi SLJIT_INDIRECT_CALL : see SLJIT_FUNC_ADDR() for more information 67*22dc650dSSadaf Ebrahimi 68*22dc650dSSadaf Ebrahimi Constants: 69*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_REGISTERS : number of available registers 70*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers 71*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers 72*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers 73*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers 74*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers 75*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_TEMPORARY_REGISTERS : number of available temporary registers 76*22dc650dSSadaf Ebrahimi SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS : number of available temporary floating point registers 77*22dc650dSSadaf Ebrahimi SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index 78*22dc650dSSadaf Ebrahimi SLJIT_F32_SHIFT : the shift required to apply when accessing 79*22dc650dSSadaf Ebrahimi a single precision floating point array by index 80*22dc650dSSadaf Ebrahimi SLJIT_F64_SHIFT : the shift required to apply when accessing 81*22dc650dSSadaf Ebrahimi a double precision floating point array by index 82*22dc650dSSadaf Ebrahimi SLJIT_PREF_SHIFT_REG : x86 systems prefers ecx for shifting by register 83*22dc650dSSadaf Ebrahimi the scratch register index of ecx is stored in this variable 84*22dc650dSSadaf Ebrahimi SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET) 85*22dc650dSSadaf Ebrahimi SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address 86*22dc650dSSadaf Ebrahimi SLJIT_CONV_MAX_FLOAT : result when a floating point value is converted to integer 87*22dc650dSSadaf Ebrahimi and the floating point value is higher than the maximum integer value 88*22dc650dSSadaf Ebrahimi (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT) 89*22dc650dSSadaf Ebrahimi SLJIT_CONV_MIN_FLOAT : result when a floating point value is converted to integer 90*22dc650dSSadaf Ebrahimi and the floating point value is lower than the minimum integer value 91*22dc650dSSadaf Ebrahimi (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT) 92*22dc650dSSadaf Ebrahimi SLJIT_CONV_NAN_FLOAT : result when a NaN floating point value is converted to integer 93*22dc650dSSadaf Ebrahimi (possible values: SLJIT_CONV_RESULT_MAX_INT, SLJIT_CONV_RESULT_MIN_INT, 94*22dc650dSSadaf Ebrahimi or SLJIT_CONV_RESULT_ZERO) 95*22dc650dSSadaf Ebrahimi 96*22dc650dSSadaf Ebrahimi Other macros: 97*22dc650dSSadaf Ebrahimi SLJIT_TMP_R0 .. R9 : accessing temporary registers 98*22dc650dSSadaf Ebrahimi SLJIT_TMP_R(i) : accessing temporary registers 99*22dc650dSSadaf Ebrahimi SLJIT_TMP_FR0 .. FR9 : accessing temporary floating point registers 100*22dc650dSSadaf Ebrahimi SLJIT_TMP_FR(i) : accessing temporary floating point registers 101*22dc650dSSadaf Ebrahimi SLJIT_TMP_DEST_REG : a temporary register for results 102*22dc650dSSadaf Ebrahimi SLJIT_TMP_MEM_REG : a temporary base register for accessing memory 103*22dc650dSSadaf Ebrahimi (can be the same as SLJIT_TMP_DEST_REG) 104*22dc650dSSadaf Ebrahimi SLJIT_TMP_DEST_FREG : a temporary register for float results 105*22dc650dSSadaf Ebrahimi SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT 106*22dc650dSSadaf Ebrahimi SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper) 107*22dc650dSSadaf Ebrahimi SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit 108*22dc650dSSadaf Ebrahimi floating point register when SLJIT_HAS_F64_AS_F32_PAIR returns non-zero 109*22dc650dSSadaf Ebrahimi */ 110*22dc650dSSadaf Ebrahimi 111*22dc650dSSadaf Ebrahimi /***********************************************************/ 112*22dc650dSSadaf Ebrahimi /* Intel Control-flow Enforcement Technology (CET) spport. */ 113*22dc650dSSadaf Ebrahimi /***********************************************************/ 114*22dc650dSSadaf Ebrahimi 115*22dc650dSSadaf Ebrahimi #ifdef SLJIT_CONFIG_X86 116*22dc650dSSadaf Ebrahimi 117*22dc650dSSadaf Ebrahimi #if defined(__CET__) && !(defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET) 118*22dc650dSSadaf Ebrahimi #define SLJIT_CONFIG_X86_CET 1 119*22dc650dSSadaf Ebrahimi #endif 120*22dc650dSSadaf Ebrahimi 121*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET) && defined(__GNUC__) 122*22dc650dSSadaf Ebrahimi #include <x86intrin.h> 123*22dc650dSSadaf Ebrahimi #endif 124*22dc650dSSadaf Ebrahimi 125*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_X86 */ 126*22dc650dSSadaf Ebrahimi 127*22dc650dSSadaf Ebrahimi /**********************************/ 128*22dc650dSSadaf Ebrahimi /* External function definitions. */ 129*22dc650dSSadaf Ebrahimi /**********************************/ 130*22dc650dSSadaf Ebrahimi 131*22dc650dSSadaf Ebrahimi /* General macros: 132*22dc650dSSadaf Ebrahimi Note: SLJIT is designed to be independent from them as possible. 133*22dc650dSSadaf Ebrahimi 134*22dc650dSSadaf Ebrahimi In release mode (SLJIT_DEBUG is not defined) only the following 135*22dc650dSSadaf Ebrahimi external functions are needed: 136*22dc650dSSadaf Ebrahimi */ 137*22dc650dSSadaf Ebrahimi 138*22dc650dSSadaf Ebrahimi #ifndef SLJIT_MALLOC 139*22dc650dSSadaf Ebrahimi #define SLJIT_MALLOC(size, allocator_data) (malloc(size)) 140*22dc650dSSadaf Ebrahimi #endif 141*22dc650dSSadaf Ebrahimi 142*22dc650dSSadaf Ebrahimi #ifndef SLJIT_FREE 143*22dc650dSSadaf Ebrahimi #define SLJIT_FREE(ptr, allocator_data) (free(ptr)) 144*22dc650dSSadaf Ebrahimi #endif 145*22dc650dSSadaf Ebrahimi 146*22dc650dSSadaf Ebrahimi #ifndef SLJIT_MEMCPY 147*22dc650dSSadaf Ebrahimi #define SLJIT_MEMCPY(dest, src, len) (memcpy(dest, src, len)) 148*22dc650dSSadaf Ebrahimi #endif 149*22dc650dSSadaf Ebrahimi 150*22dc650dSSadaf Ebrahimi #ifndef SLJIT_MEMMOVE 151*22dc650dSSadaf Ebrahimi #define SLJIT_MEMMOVE(dest, src, len) (memmove(dest, src, len)) 152*22dc650dSSadaf Ebrahimi #endif 153*22dc650dSSadaf Ebrahimi 154*22dc650dSSadaf Ebrahimi #ifndef SLJIT_ZEROMEM 155*22dc650dSSadaf Ebrahimi #define SLJIT_ZEROMEM(dest, len) (memset(dest, 0, len)) 156*22dc650dSSadaf Ebrahimi #endif 157*22dc650dSSadaf Ebrahimi 158*22dc650dSSadaf Ebrahimi /***************************/ 159*22dc650dSSadaf Ebrahimi /* Compiler helper macros. */ 160*22dc650dSSadaf Ebrahimi /***************************/ 161*22dc650dSSadaf Ebrahimi 162*22dc650dSSadaf Ebrahimi #if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) 163*22dc650dSSadaf Ebrahimi 164*22dc650dSSadaf Ebrahimi #if defined(__GNUC__) && (__GNUC__ >= 3) 165*22dc650dSSadaf Ebrahimi #define SLJIT_LIKELY(x) __builtin_expect((x), 1) 166*22dc650dSSadaf Ebrahimi #define SLJIT_UNLIKELY(x) __builtin_expect((x), 0) 167*22dc650dSSadaf Ebrahimi #else 168*22dc650dSSadaf Ebrahimi #define SLJIT_LIKELY(x) (x) 169*22dc650dSSadaf Ebrahimi #define SLJIT_UNLIKELY(x) (x) 170*22dc650dSSadaf Ebrahimi #endif 171*22dc650dSSadaf Ebrahimi 172*22dc650dSSadaf Ebrahimi #endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */ 173*22dc650dSSadaf Ebrahimi 174*22dc650dSSadaf Ebrahimi #ifndef SLJIT_INLINE 175*22dc650dSSadaf Ebrahimi /* Inline functions. Some old compilers do not support them. */ 176*22dc650dSSadaf Ebrahimi #ifdef __SUNPRO_C 177*22dc650dSSadaf Ebrahimi #if __SUNPRO_C < 0x560 178*22dc650dSSadaf Ebrahimi #define SLJIT_INLINE 179*22dc650dSSadaf Ebrahimi #else 180*22dc650dSSadaf Ebrahimi #define SLJIT_INLINE inline 181*22dc650dSSadaf Ebrahimi #endif /* __SUNPRO_C */ 182*22dc650dSSadaf Ebrahimi #else 183*22dc650dSSadaf Ebrahimi #define SLJIT_INLINE __inline 184*22dc650dSSadaf Ebrahimi #endif 185*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_INLINE */ 186*22dc650dSSadaf Ebrahimi 187*22dc650dSSadaf Ebrahimi #ifndef SLJIT_NOINLINE 188*22dc650dSSadaf Ebrahimi /* Not inline functions. */ 189*22dc650dSSadaf Ebrahimi #if defined(__GNUC__) 190*22dc650dSSadaf Ebrahimi #define SLJIT_NOINLINE __attribute__ ((noinline)) 191*22dc650dSSadaf Ebrahimi #else 192*22dc650dSSadaf Ebrahimi #define SLJIT_NOINLINE 193*22dc650dSSadaf Ebrahimi #endif 194*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_INLINE */ 195*22dc650dSSadaf Ebrahimi 196*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UNUSED_ARG 197*22dc650dSSadaf Ebrahimi /* Unused arguments. */ 198*22dc650dSSadaf Ebrahimi #define SLJIT_UNUSED_ARG(arg) (void)arg 199*22dc650dSSadaf Ebrahimi #endif 200*22dc650dSSadaf Ebrahimi 201*22dc650dSSadaf Ebrahimi /*********************************/ 202*22dc650dSSadaf Ebrahimi /* Type of public API functions. */ 203*22dc650dSSadaf Ebrahimi /*********************************/ 204*22dc650dSSadaf Ebrahimi 205*22dc650dSSadaf Ebrahimi #ifndef SLJIT_API_FUNC_ATTRIBUTE 206*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) 207*22dc650dSSadaf Ebrahimi /* Static ABI functions. For all-in-one programs. */ 208*22dc650dSSadaf Ebrahimi 209*22dc650dSSadaf Ebrahimi #if defined(__GNUC__) 210*22dc650dSSadaf Ebrahimi /* Disable unused warnings in gcc. */ 211*22dc650dSSadaf Ebrahimi #define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused)) 212*22dc650dSSadaf Ebrahimi #else 213*22dc650dSSadaf Ebrahimi #define SLJIT_API_FUNC_ATTRIBUTE static 214*22dc650dSSadaf Ebrahimi #endif 215*22dc650dSSadaf Ebrahimi 216*22dc650dSSadaf Ebrahimi #else 217*22dc650dSSadaf Ebrahimi #define SLJIT_API_FUNC_ATTRIBUTE 218*22dc650dSSadaf Ebrahimi #endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */ 219*22dc650dSSadaf Ebrahimi #endif /* defined SLJIT_API_FUNC_ATTRIBUTE */ 220*22dc650dSSadaf Ebrahimi 221*22dc650dSSadaf Ebrahimi /****************************/ 222*22dc650dSSadaf Ebrahimi /* Instruction cache flush. */ 223*22dc650dSSadaf Ebrahimi /****************************/ 224*22dc650dSSadaf Ebrahimi 225*22dc650dSSadaf Ebrahimi #ifdef __APPLE__ 226*22dc650dSSadaf Ebrahimi #include <AvailabilityMacros.h> 227*22dc650dSSadaf Ebrahimi #endif 228*22dc650dSSadaf Ebrahimi 229*22dc650dSSadaf Ebrahimi /* 230*22dc650dSSadaf Ebrahimi * TODO: 231*22dc650dSSadaf Ebrahimi * 232*22dc650dSSadaf Ebrahimi * clang >= 15 could be safe to enable below 233*22dc650dSSadaf Ebrahimi * older versions are known to abort in some targets 234*22dc650dSSadaf Ebrahimi * https://github.com/PhilipHazel/pcre2/issues/92 235*22dc650dSSadaf Ebrahimi * 236*22dc650dSSadaf Ebrahimi * beware some vendors (ex: Microsoft, Apple) are known to have 237*22dc650dSSadaf Ebrahimi * removed the code to support this builtin even if the call for 238*22dc650dSSadaf Ebrahimi * __has_builtin reports it is available. 239*22dc650dSSadaf Ebrahimi * 240*22dc650dSSadaf Ebrahimi * make sure linking doesn't fail because __clear_cache() is 241*22dc650dSSadaf Ebrahimi * missing before changing it or add an exception so that the 242*22dc650dSSadaf Ebrahimi * system provided method that should be defined below is used 243*22dc650dSSadaf Ebrahimi * instead. 244*22dc650dSSadaf Ebrahimi */ 245*22dc650dSSadaf Ebrahimi #if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) 246*22dc650dSSadaf Ebrahimi #if __has_builtin(__builtin___clear_cache) && !defined(__clang__) 247*22dc650dSSadaf Ebrahimi 248*22dc650dSSadaf Ebrahimi /* 249*22dc650dSSadaf Ebrahimi * https://gcc.gnu.org/bugzilla//show_bug.cgi?id=91248 250*22dc650dSSadaf Ebrahimi * https://gcc.gnu.org/bugzilla//show_bug.cgi?id=93811 251*22dc650dSSadaf Ebrahimi * gcc's clear_cache builtin for power is broken 252*22dc650dSSadaf Ebrahimi */ 253*22dc650dSSadaf Ebrahimi #if !defined(SLJIT_CONFIG_PPC) 254*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 255*22dc650dSSadaf Ebrahimi __builtin___clear_cache((char*)(from), (char*)(to)) 256*22dc650dSSadaf Ebrahimi #endif 257*22dc650dSSadaf Ebrahimi 258*22dc650dSSadaf Ebrahimi #endif /* gcc >= 10 */ 259*22dc650dSSadaf Ebrahimi #endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */ 260*22dc650dSSadaf Ebrahimi 261*22dc650dSSadaf Ebrahimi #ifndef SLJIT_CACHE_FLUSH 262*22dc650dSSadaf Ebrahimi 263*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ 264*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) 265*22dc650dSSadaf Ebrahimi 266*22dc650dSSadaf Ebrahimi /* Not required to implement on archs with unified caches. */ 267*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) 268*22dc650dSSadaf Ebrahimi 269*22dc650dSSadaf Ebrahimi #elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 270*22dc650dSSadaf Ebrahimi 271*22dc650dSSadaf Ebrahimi /* Supported by all macs since Mac OS 10.5. 272*22dc650dSSadaf Ebrahimi However, it does not work on non-jailbroken iOS devices, 273*22dc650dSSadaf Ebrahimi although the compilation is successful. */ 274*22dc650dSSadaf Ebrahimi #include <libkern/OSCacheControl.h> 275*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 276*22dc650dSSadaf Ebrahimi sys_icache_invalidate((void*)(from), (size_t)((char*)(to) - (char*)(from))) 277*22dc650dSSadaf Ebrahimi 278*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 279*22dc650dSSadaf Ebrahimi 280*22dc650dSSadaf Ebrahimi /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ 281*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 282*22dc650dSSadaf Ebrahimi ppc_cache_flush((from), (to)) 283*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH_OWN_IMPL 1 284*22dc650dSSadaf Ebrahimi 285*22dc650dSSadaf Ebrahimi #elif defined(_WIN32) 286*22dc650dSSadaf Ebrahimi 287*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 288*22dc650dSSadaf Ebrahimi FlushInstructionCache(GetCurrentProcess(), (void*)(from), (char*)(to) - (char*)(from)) 289*22dc650dSSadaf Ebrahimi 290*22dc650dSSadaf Ebrahimi #elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || defined(__clang__) 291*22dc650dSSadaf Ebrahimi 292*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 293*22dc650dSSadaf Ebrahimi __builtin___clear_cache((char*)(from), (char*)(to)) 294*22dc650dSSadaf Ebrahimi 295*22dc650dSSadaf Ebrahimi #elif defined __ANDROID__ 296*22dc650dSSadaf Ebrahimi 297*22dc650dSSadaf Ebrahimi /* Android ARMv7 with gcc lacks __clear_cache; use cacheflush instead. */ 298*22dc650dSSadaf Ebrahimi #include <sys/cachectl.h> 299*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 300*22dc650dSSadaf Ebrahimi cacheflush((long)(from), (long)(to), 0) 301*22dc650dSSadaf Ebrahimi 302*22dc650dSSadaf Ebrahimi #else 303*22dc650dSSadaf Ebrahimi 304*22dc650dSSadaf Ebrahimi /* Call __ARM_NR_cacheflush on ARM-Linux or the corresponding MIPS syscall. */ 305*22dc650dSSadaf Ebrahimi #define SLJIT_CACHE_FLUSH(from, to) \ 306*22dc650dSSadaf Ebrahimi __clear_cache((char*)(from), (char*)(to)) 307*22dc650dSSadaf Ebrahimi 308*22dc650dSSadaf Ebrahimi #endif 309*22dc650dSSadaf Ebrahimi 310*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_CACHE_FLUSH */ 311*22dc650dSSadaf Ebrahimi 312*22dc650dSSadaf Ebrahimi /******************************************************/ 313*22dc650dSSadaf Ebrahimi /* Integer and floating point type definitions. */ 314*22dc650dSSadaf Ebrahimi /******************************************************/ 315*22dc650dSSadaf Ebrahimi 316*22dc650dSSadaf Ebrahimi /* 8 bit byte type. */ 317*22dc650dSSadaf Ebrahimi typedef unsigned char sljit_u8; 318*22dc650dSSadaf Ebrahimi typedef signed char sljit_s8; 319*22dc650dSSadaf Ebrahimi 320*22dc650dSSadaf Ebrahimi /* 16 bit half-word type. */ 321*22dc650dSSadaf Ebrahimi typedef unsigned short int sljit_u16; 322*22dc650dSSadaf Ebrahimi typedef signed short int sljit_s16; 323*22dc650dSSadaf Ebrahimi 324*22dc650dSSadaf Ebrahimi /* 32 bit integer type. */ 325*22dc650dSSadaf Ebrahimi typedef unsigned int sljit_u32; 326*22dc650dSSadaf Ebrahimi typedef signed int sljit_s32; 327*22dc650dSSadaf Ebrahimi 328*22dc650dSSadaf Ebrahimi /* Machine word type. Enough for storing a pointer. 329*22dc650dSSadaf Ebrahimi 32 bit for 32 bit machines. 330*22dc650dSSadaf Ebrahimi 64 bit for 64 bit machines. */ 331*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 332*22dc650dSSadaf Ebrahimi /* Just to have something. */ 333*22dc650dSSadaf Ebrahimi #define SLJIT_WORD_SHIFT 0 334*22dc650dSSadaf Ebrahimi typedef unsigned int sljit_uw; 335*22dc650dSSadaf Ebrahimi typedef int sljit_sw; 336*22dc650dSSadaf Ebrahimi #elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ 337*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 338*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ 339*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ 340*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \ 341*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 342*22dc650dSSadaf Ebrahimi && !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64) 343*22dc650dSSadaf Ebrahimi #define SLJIT_32BIT_ARCHITECTURE 1 344*22dc650dSSadaf Ebrahimi #define SLJIT_WORD_SHIFT 2 345*22dc650dSSadaf Ebrahimi typedef unsigned int sljit_uw; 346*22dc650dSSadaf Ebrahimi typedef int sljit_sw; 347*22dc650dSSadaf Ebrahimi #else 348*22dc650dSSadaf Ebrahimi #define SLJIT_64BIT_ARCHITECTURE 1 349*22dc650dSSadaf Ebrahimi #define SLJIT_WORD_SHIFT 3 350*22dc650dSSadaf Ebrahimi #ifdef _WIN32 351*22dc650dSSadaf Ebrahimi #ifdef __GNUC__ 352*22dc650dSSadaf Ebrahimi /* These types do not require windows.h */ 353*22dc650dSSadaf Ebrahimi typedef unsigned long long sljit_uw; 354*22dc650dSSadaf Ebrahimi typedef long long sljit_sw; 355*22dc650dSSadaf Ebrahimi #else 356*22dc650dSSadaf Ebrahimi typedef unsigned __int64 sljit_uw; 357*22dc650dSSadaf Ebrahimi typedef __int64 sljit_sw; 358*22dc650dSSadaf Ebrahimi #endif 359*22dc650dSSadaf Ebrahimi #else /* !_WIN32 */ 360*22dc650dSSadaf Ebrahimi typedef unsigned long int sljit_uw; 361*22dc650dSSadaf Ebrahimi typedef long int sljit_sw; 362*22dc650dSSadaf Ebrahimi #endif /* _WIN32 */ 363*22dc650dSSadaf Ebrahimi #endif 364*22dc650dSSadaf Ebrahimi 365*22dc650dSSadaf Ebrahimi typedef sljit_sw sljit_sp; 366*22dc650dSSadaf Ebrahimi typedef sljit_uw sljit_up; 367*22dc650dSSadaf Ebrahimi 368*22dc650dSSadaf Ebrahimi /* Floating point types. */ 369*22dc650dSSadaf Ebrahimi typedef float sljit_f32; 370*22dc650dSSadaf Ebrahimi typedef double sljit_f64; 371*22dc650dSSadaf Ebrahimi 372*22dc650dSSadaf Ebrahimi /* Shift for pointer sized data. */ 373*22dc650dSSadaf Ebrahimi #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT 374*22dc650dSSadaf Ebrahimi 375*22dc650dSSadaf Ebrahimi /* Shift for double precision sized data. */ 376*22dc650dSSadaf Ebrahimi #define SLJIT_F32_SHIFT 2 377*22dc650dSSadaf Ebrahimi #define SLJIT_F64_SHIFT 3 378*22dc650dSSadaf Ebrahimi 379*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_RESULT_MAX_INT 0 380*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_RESULT_MIN_INT 1 381*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_RESULT_ZERO 2 382*22dc650dSSadaf Ebrahimi 383*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) 384*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MIN_INT 385*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 386*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT 387*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) 388*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 389*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 390*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO 391*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) 392*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 393*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MAX_INT 394*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT 395*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 396*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 397*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 398*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT 399*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) 400*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 401*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 402*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT 403*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) 404*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 405*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 406*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT 407*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) 408*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT 409*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT 410*22dc650dSSadaf Ebrahimi #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO 411*22dc650dSSadaf Ebrahimi #else 412*22dc650dSSadaf Ebrahimi #error "Result for float to integer conversion is not defined" 413*22dc650dSSadaf Ebrahimi #endif 414*22dc650dSSadaf Ebrahimi 415*22dc650dSSadaf Ebrahimi #ifndef SLJIT_W 416*22dc650dSSadaf Ebrahimi 417*22dc650dSSadaf Ebrahimi /* Defining long constants. */ 418*22dc650dSSadaf Ebrahimi #if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) 419*22dc650dSSadaf Ebrahimi #ifdef _WIN64 420*22dc650dSSadaf Ebrahimi #define SLJIT_W(w) (w##ll) 421*22dc650dSSadaf Ebrahimi #else /* !windows */ 422*22dc650dSSadaf Ebrahimi #define SLJIT_W(w) (w##l) 423*22dc650dSSadaf Ebrahimi #endif /* windows */ 424*22dc650dSSadaf Ebrahimi #else /* 32 bit */ 425*22dc650dSSadaf Ebrahimi #define SLJIT_W(w) (w) 426*22dc650dSSadaf Ebrahimi #endif /* unknown */ 427*22dc650dSSadaf Ebrahimi 428*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_W */ 429*22dc650dSSadaf Ebrahimi 430*22dc650dSSadaf Ebrahimi /*************************/ 431*22dc650dSSadaf Ebrahimi /* Endianness detection. */ 432*22dc650dSSadaf Ebrahimi /*************************/ 433*22dc650dSSadaf Ebrahimi 434*22dc650dSSadaf Ebrahimi #if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) 435*22dc650dSSadaf Ebrahimi 436*22dc650dSSadaf Ebrahimi /* These macros are mostly useful for the applications. */ 437*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 438*22dc650dSSadaf Ebrahimi 439*22dc650dSSadaf Ebrahimi #ifdef __LITTLE_ENDIAN__ 440*22dc650dSSadaf Ebrahimi #define SLJIT_LITTLE_ENDIAN 1 441*22dc650dSSadaf Ebrahimi #else 442*22dc650dSSadaf Ebrahimi #define SLJIT_BIG_ENDIAN 1 443*22dc650dSSadaf Ebrahimi #endif 444*22dc650dSSadaf Ebrahimi 445*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) 446*22dc650dSSadaf Ebrahimi 447*22dc650dSSadaf Ebrahimi #ifdef __MIPSEL__ 448*22dc650dSSadaf Ebrahimi #define SLJIT_LITTLE_ENDIAN 1 449*22dc650dSSadaf Ebrahimi #else 450*22dc650dSSadaf Ebrahimi #define SLJIT_BIG_ENDIAN 1 451*22dc650dSSadaf Ebrahimi #endif 452*22dc650dSSadaf Ebrahimi 453*22dc650dSSadaf Ebrahimi #ifndef SLJIT_MIPS_REV 454*22dc650dSSadaf Ebrahimi 455*22dc650dSSadaf Ebrahimi /* Auto detecting mips revision. */ 456*22dc650dSSadaf Ebrahimi #if (defined __mips_isa_rev) && (__mips_isa_rev >= 6) 457*22dc650dSSadaf Ebrahimi #define SLJIT_MIPS_REV 6 458*22dc650dSSadaf Ebrahimi #elif defined(__mips_isa_rev) && __mips_isa_rev >= 1 459*22dc650dSSadaf Ebrahimi #define SLJIT_MIPS_REV __mips_isa_rev 460*22dc650dSSadaf Ebrahimi #elif defined(__clang__) \ 461*22dc650dSSadaf Ebrahimi && (defined(_MIPS_ARCH_OCTEON) || defined(_MIPS_ARCH_P5600)) 462*22dc650dSSadaf Ebrahimi /* clang either forgets to define (clang-7) __mips_isa_rev at all 463*22dc650dSSadaf Ebrahimi * or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+) 464*22dc650dSSadaf Ebrahimi * and -march=p5600 (MIPS32 R5). 465*22dc650dSSadaf Ebrahimi * It also sets the __mips macro to 64 or 32 for -mipsN when N <= 5 466*22dc650dSSadaf Ebrahimi * (should be set to N exactly) so we cannot rely on this too. 467*22dc650dSSadaf Ebrahimi */ 468*22dc650dSSadaf Ebrahimi #define SLJIT_MIPS_REV 1 469*22dc650dSSadaf Ebrahimi #endif 470*22dc650dSSadaf Ebrahimi 471*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_MIPS_REV */ 472*22dc650dSSadaf Ebrahimi 473*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) 474*22dc650dSSadaf Ebrahimi 475*22dc650dSSadaf Ebrahimi #define SLJIT_BIG_ENDIAN 1 476*22dc650dSSadaf Ebrahimi 477*22dc650dSSadaf Ebrahimi #else 478*22dc650dSSadaf Ebrahimi #define SLJIT_LITTLE_ENDIAN 1 479*22dc650dSSadaf Ebrahimi #endif 480*22dc650dSSadaf Ebrahimi 481*22dc650dSSadaf Ebrahimi #endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */ 482*22dc650dSSadaf Ebrahimi 483*22dc650dSSadaf Ebrahimi /* Sanity check. */ 484*22dc650dSSadaf Ebrahimi #if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) 485*22dc650dSSadaf Ebrahimi #error "Exactly one endianness must be selected" 486*22dc650dSSadaf Ebrahimi #endif 487*22dc650dSSadaf Ebrahimi 488*22dc650dSSadaf Ebrahimi #if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) 489*22dc650dSSadaf Ebrahimi #error "Exactly one endianness must be selected" 490*22dc650dSSadaf Ebrahimi #endif 491*22dc650dSSadaf Ebrahimi 492*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UNALIGNED 493*22dc650dSSadaf Ebrahimi 494*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ 495*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ 496*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ 497*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 498*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ 499*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ 500*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 501*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) 502*22dc650dSSadaf Ebrahimi #define SLJIT_UNALIGNED 1 503*22dc650dSSadaf Ebrahimi #endif 504*22dc650dSSadaf Ebrahimi 505*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_UNALIGNED */ 506*22dc650dSSadaf Ebrahimi 507*22dc650dSSadaf Ebrahimi #ifndef SLJIT_FPU_UNALIGNED 508*22dc650dSSadaf Ebrahimi 509*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ 510*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ 511*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ 512*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ 513*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 514*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) 515*22dc650dSSadaf Ebrahimi #define SLJIT_FPU_UNALIGNED 1 516*22dc650dSSadaf Ebrahimi #endif 517*22dc650dSSadaf Ebrahimi 518*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_FPU_UNALIGNED */ 519*22dc650dSSadaf Ebrahimi 520*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) 521*22dc650dSSadaf Ebrahimi /* Auto detect SSE2 support using CPUID. 522*22dc650dSSadaf Ebrahimi On 64 bit x86 cpus, sse2 must be present. */ 523*22dc650dSSadaf Ebrahimi #define SLJIT_DETECT_SSE2 1 524*22dc650dSSadaf Ebrahimi #endif 525*22dc650dSSadaf Ebrahimi 526*22dc650dSSadaf Ebrahimi /*****************************************************************************************/ 527*22dc650dSSadaf Ebrahimi /* Calling convention of functions generated by SLJIT or called from the generated code. */ 528*22dc650dSSadaf Ebrahimi /*****************************************************************************************/ 529*22dc650dSSadaf Ebrahimi 530*22dc650dSSadaf Ebrahimi #ifndef SLJIT_FUNC 531*22dc650dSSadaf Ebrahimi #define SLJIT_FUNC 532*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_FUNC */ 533*22dc650dSSadaf Ebrahimi 534*22dc650dSSadaf Ebrahimi #ifndef SLJIT_INDIRECT_CALL 535*22dc650dSSadaf Ebrahimi #if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \ 536*22dc650dSSadaf Ebrahimi || ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX) 537*22dc650dSSadaf Ebrahimi /* It seems certain ppc compilers use an indirect addressing for functions 538*22dc650dSSadaf Ebrahimi which makes things complicated. */ 539*22dc650dSSadaf Ebrahimi #define SLJIT_INDIRECT_CALL 1 540*22dc650dSSadaf Ebrahimi #endif 541*22dc650dSSadaf Ebrahimi #endif /* SLJIT_INDIRECT_CALL */ 542*22dc650dSSadaf Ebrahimi 543*22dc650dSSadaf Ebrahimi /* The offset which needs to be subtracted from the return address to 544*22dc650dSSadaf Ebrahimi determine the next executed instruction after return. */ 545*22dc650dSSadaf Ebrahimi #ifndef SLJIT_RETURN_ADDRESS_OFFSET 546*22dc650dSSadaf Ebrahimi #define SLJIT_RETURN_ADDRESS_OFFSET 0 547*22dc650dSSadaf Ebrahimi #endif /* SLJIT_RETURN_ADDRESS_OFFSET */ 548*22dc650dSSadaf Ebrahimi 549*22dc650dSSadaf Ebrahimi /***************************************************/ 550*22dc650dSSadaf Ebrahimi /* Functions of the built-in executable allocator. */ 551*22dc650dSSadaf Ebrahimi /***************************************************/ 552*22dc650dSSadaf Ebrahimi 553*22dc650dSSadaf Ebrahimi #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) 554*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size); 555*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr); 556*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void); 557*22dc650dSSadaf Ebrahimi #define SLJIT_BUILTIN_MALLOC_EXEC(size, exec_allocator_data) sljit_malloc_exec(size) 558*22dc650dSSadaf Ebrahimi #define SLJIT_BUILTIN_FREE_EXEC(ptr, exec_allocator_data) sljit_free_exec(ptr) 559*22dc650dSSadaf Ebrahimi 560*22dc650dSSadaf Ebrahimi #ifndef SLJIT_MALLOC_EXEC 561*22dc650dSSadaf Ebrahimi #define SLJIT_MALLOC_EXEC(size, exec_allocator_data) SLJIT_BUILTIN_MALLOC_EXEC((size), (exec_allocator_data)) 562*22dc650dSSadaf Ebrahimi #endif /* SLJIT_MALLOC_EXEC */ 563*22dc650dSSadaf Ebrahimi 564*22dc650dSSadaf Ebrahimi #ifndef SLJIT_FREE_EXEC 565*22dc650dSSadaf Ebrahimi #define SLJIT_FREE_EXEC(ptr, exec_allocator_data) SLJIT_BUILTIN_FREE_EXEC((ptr), (exec_allocator_data)) 566*22dc650dSSadaf Ebrahimi #endif /* SLJIT_FREE_EXEC */ 567*22dc650dSSadaf Ebrahimi 568*22dc650dSSadaf Ebrahimi #if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) 569*22dc650dSSadaf Ebrahimi SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void *code); 570*22dc650dSSadaf Ebrahimi #define SLJIT_EXEC_OFFSET(code) sljit_exec_offset(code) 571*22dc650dSSadaf Ebrahimi #endif /* SLJIT_PROT_EXECUTABLE_ALLOCATOR */ 572*22dc650dSSadaf Ebrahimi 573*22dc650dSSadaf Ebrahimi #endif /* SLJIT_EXECUTABLE_ALLOCATOR */ 574*22dc650dSSadaf Ebrahimi 575*22dc650dSSadaf Ebrahimi #ifndef SLJIT_EXEC_OFFSET 576*22dc650dSSadaf Ebrahimi #define SLJIT_EXEC_OFFSET(ptr) 0 577*22dc650dSSadaf Ebrahimi #endif 578*22dc650dSSadaf Ebrahimi 579*22dc650dSSadaf Ebrahimi /**********************************************/ 580*22dc650dSSadaf Ebrahimi /* Registers and locals offset determination. */ 581*22dc650dSSadaf Ebrahimi /**********************************************/ 582*22dc650dSSadaf Ebrahimi 583*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) 584*22dc650dSSadaf Ebrahimi 585*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 12 586*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 7 587*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 1 588*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 7 589*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 590*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 591*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R0 592*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R0 593*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 594*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE (8 * SSIZE_OF(sw)) 595*22dc650dSSadaf Ebrahimi #define SLJIT_PREF_SHIFT_REG SLJIT_R2 596*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 597*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 598*22dc650dSSadaf Ebrahimi 599*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) 600*22dc650dSSadaf Ebrahimi 601*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 13 602*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2 603*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15 604*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 605*22dc650dSSadaf Ebrahimi #ifndef _WIN64 606*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 6 607*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 608*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 609*22dc650dSSadaf Ebrahimi #else /* _WIN64 */ 610*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 611*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 10 612*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE (4 * SSIZE_OF(sw)) 613*22dc650dSSadaf Ebrahimi #endif /* !_WIN64 */ 614*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R0 615*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R0 616*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 617*22dc650dSSadaf Ebrahimi #define SLJIT_PREF_SHIFT_REG SLJIT_R3 618*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 619*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 620*22dc650dSSadaf Ebrahimi 621*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) 622*22dc650dSSadaf Ebrahimi 623*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 12 624*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 625*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2 626*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14 627*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 628*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 629*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R1 630*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R1 631*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 632*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 633*22dc650dSSadaf Ebrahimi 634*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) 635*22dc650dSSadaf Ebrahimi 636*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 26 637*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 638*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 639*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 640*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 641*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 642*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R0 643*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R0 644*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 645*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE (2 * (sljit_s32)sizeof(sljit_sw)) 646*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 647*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 648*22dc650dSSadaf Ebrahimi 649*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) 650*22dc650dSSadaf Ebrahimi 651*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 23 652*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 17 653*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 654*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 655*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 18 656*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 657*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R1 658*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R1 659*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 660*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX) 661*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * (sljit_s32)sizeof(sljit_sw)) 662*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) 663*22dc650dSSadaf Ebrahimi /* Add +1 for double alignment. */ 664*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * (sljit_s32)sizeof(sljit_sw)) 665*22dc650dSSadaf Ebrahimi #else 666*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE (3 * (sljit_s32)sizeof(sljit_sw)) 667*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_PPC_64 || _AIX */ 668*22dc650dSSadaf Ebrahimi 669*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) 670*22dc650dSSadaf Ebrahimi 671*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 21 672*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 673*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) 674*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE (4 * (sljit_s32)sizeof(sljit_sw)) 675*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 13 676*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 6 677*22dc650dSSadaf Ebrahimi #else 678*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 679*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 29 680*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 681*22dc650dSSadaf Ebrahimi #endif 682*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 683*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 3 684*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R1 685*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R1 686*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 687*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 688*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 689*22dc650dSSadaf Ebrahimi 690*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) 691*22dc650dSSadaf Ebrahimi 692*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 23 693*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 12 694*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 695*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 696*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12 697*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 698*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R1 699*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R1 700*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 701*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 702*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 703*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 704*22dc650dSSadaf Ebrahimi 705*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) 706*22dc650dSSadaf Ebrahimi 707*22dc650dSSadaf Ebrahimi /* 708*22dc650dSSadaf Ebrahimi * https://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html#STACKFRAME 709*22dc650dSSadaf Ebrahimi * 710*22dc650dSSadaf Ebrahimi * 160 711*22dc650dSSadaf Ebrahimi * .. FR6 712*22dc650dSSadaf Ebrahimi * .. FR4 713*22dc650dSSadaf Ebrahimi * .. FR2 714*22dc650dSSadaf Ebrahimi * 128 FR0 715*22dc650dSSadaf Ebrahimi * 120 R15 (used for SP) 716*22dc650dSSadaf Ebrahimi * 112 R14 717*22dc650dSSadaf Ebrahimi * 104 R13 718*22dc650dSSadaf Ebrahimi * 96 R12 719*22dc650dSSadaf Ebrahimi * .. 720*22dc650dSSadaf Ebrahimi * 48 R6 721*22dc650dSSadaf Ebrahimi * .. 722*22dc650dSSadaf Ebrahimi * 16 R2 723*22dc650dSSadaf Ebrahimi * 8 RESERVED 724*22dc650dSSadaf Ebrahimi * 0 SP 725*22dc650dSSadaf Ebrahimi */ 726*22dc650dSSadaf Ebrahimi #define SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE 160 727*22dc650dSSadaf Ebrahimi 728*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 12 729*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 730*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3 731*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15 732*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8 733*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1 734*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R0 735*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R2 736*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 737*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE 738*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 739*22dc650dSSadaf Ebrahimi 740*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) 741*22dc650dSSadaf Ebrahimi 742*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 23 743*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 744*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5 745*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30 746*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12 747*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2 748*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG SLJIT_TMP_R1 749*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG SLJIT_TMP_R1 750*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0 751*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 752*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT 1 753*22dc650dSSadaf Ebrahimi #define SLJIT_MASKED_SHIFT32 1 754*22dc650dSSadaf Ebrahimi 755*22dc650dSSadaf Ebrahimi #elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) 756*22dc650dSSadaf Ebrahimi 757*22dc650dSSadaf Ebrahimi /* Just to have something. */ 758*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_REGISTERS 0 759*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_REGISTERS 0 760*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 0 761*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_FLOAT_REGISTERS 0 762*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 763*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 0 764*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_REG 0 765*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_MEM_REG 0 766*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_DEST_FREG 0 767*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET_BASE 0 768*22dc650dSSadaf Ebrahimi 769*22dc650dSSadaf Ebrahimi #endif 770*22dc650dSSadaf Ebrahimi 771*22dc650dSSadaf Ebrahimi #define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE) 772*22dc650dSSadaf Ebrahimi 773*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \ 774*22dc650dSSadaf Ebrahimi (SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS) 775*22dc650dSSadaf Ebrahimi 776*22dc650dSSadaf Ebrahimi #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ 777*22dc650dSSadaf Ebrahimi (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) 778*22dc650dSSadaf Ebrahimi 779*22dc650dSSadaf Ebrahimi /**********************************/ 780*22dc650dSSadaf Ebrahimi /* Temporary register management. */ 781*22dc650dSSadaf Ebrahimi /**********************************/ 782*22dc650dSSadaf Ebrahimi 783*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_REGISTER_BASE (SLJIT_NUMBER_OF_REGISTERS + 2) 784*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FREGISTER_BASE (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) 785*22dc650dSSadaf Ebrahimi 786*22dc650dSSadaf Ebrahimi /* WARNING: Accessing temporary registers is not recommended, because they 787*22dc650dSSadaf Ebrahimi are also used by the JIT compiler for various computations. Using them 788*22dc650dSSadaf Ebrahimi might have any side effects including incorrect operations and crashes, 789*22dc650dSSadaf Ebrahimi so use them at your own risk. The machine registers themselves might have 790*22dc650dSSadaf Ebrahimi limitations, e.g. the r0 register on s390x / ppc cannot be used as 791*22dc650dSSadaf Ebrahimi base address for memory operations. */ 792*22dc650dSSadaf Ebrahimi 793*22dc650dSSadaf Ebrahimi /* Temporary registers */ 794*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R0 (SLJIT_TMP_REGISTER_BASE + 0) 795*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R1 (SLJIT_TMP_REGISTER_BASE + 1) 796*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R2 (SLJIT_TMP_REGISTER_BASE + 2) 797*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R3 (SLJIT_TMP_REGISTER_BASE + 3) 798*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R4 (SLJIT_TMP_REGISTER_BASE + 4) 799*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R5 (SLJIT_TMP_REGISTER_BASE + 5) 800*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R6 (SLJIT_TMP_REGISTER_BASE + 6) 801*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R7 (SLJIT_TMP_REGISTER_BASE + 7) 802*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R8 (SLJIT_TMP_REGISTER_BASE + 8) 803*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R9 (SLJIT_TMP_REGISTER_BASE + 9) 804*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_R(i) (SLJIT_TMP_REGISTER_BASE + (i)) 805*22dc650dSSadaf Ebrahimi 806*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR0 (SLJIT_TMP_FREGISTER_BASE + 0) 807*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR1 (SLJIT_TMP_FREGISTER_BASE + 1) 808*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR2 (SLJIT_TMP_FREGISTER_BASE + 2) 809*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR3 (SLJIT_TMP_FREGISTER_BASE + 3) 810*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR4 (SLJIT_TMP_FREGISTER_BASE + 4) 811*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR5 (SLJIT_TMP_FREGISTER_BASE + 5) 812*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR6 (SLJIT_TMP_FREGISTER_BASE + 6) 813*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR7 (SLJIT_TMP_FREGISTER_BASE + 7) 814*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR8 (SLJIT_TMP_FREGISTER_BASE + 8) 815*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR9 (SLJIT_TMP_FREGISTER_BASE + 9) 816*22dc650dSSadaf Ebrahimi #define SLJIT_TMP_FR(i) (SLJIT_TMP_FREGISTER_BASE + (i)) 817*22dc650dSSadaf Ebrahimi 818*22dc650dSSadaf Ebrahimi /********************************/ 819*22dc650dSSadaf Ebrahimi /* CPU status flags management. */ 820*22dc650dSSadaf Ebrahimi /********************************/ 821*22dc650dSSadaf Ebrahimi 822*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \ 823*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ 824*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \ 825*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \ 826*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \ 827*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH) 828*22dc650dSSadaf Ebrahimi #define SLJIT_HAS_STATUS_FLAGS_STATE 1 829*22dc650dSSadaf Ebrahimi #endif 830*22dc650dSSadaf Ebrahimi 831*22dc650dSSadaf Ebrahimi /***************************************/ 832*22dc650dSSadaf Ebrahimi /* Floating point register management. */ 833*22dc650dSSadaf Ebrahimi /***************************************/ 834*22dc650dSSadaf Ebrahimi 835*22dc650dSSadaf Ebrahimi #if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ 836*22dc650dSSadaf Ebrahimi || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) 837*22dc650dSSadaf Ebrahimi #define SLJIT_F64_SECOND(reg) \ 838*22dc650dSSadaf Ebrahimi ((reg) + SLJIT_FS0 + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS) 839*22dc650dSSadaf Ebrahimi #else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */ 840*22dc650dSSadaf Ebrahimi #define SLJIT_F64_SECOND(reg) \ 841*22dc650dSSadaf Ebrahimi (reg) 842*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */ 843*22dc650dSSadaf Ebrahimi 844*22dc650dSSadaf Ebrahimi /*************************************/ 845*22dc650dSSadaf Ebrahimi /* Debug and verbose related macros. */ 846*22dc650dSSadaf Ebrahimi /*************************************/ 847*22dc650dSSadaf Ebrahimi 848*22dc650dSSadaf Ebrahimi #if (defined SLJIT_DEBUG && SLJIT_DEBUG) 849*22dc650dSSadaf Ebrahimi 850*22dc650dSSadaf Ebrahimi #if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) 851*22dc650dSSadaf Ebrahimi 852*22dc650dSSadaf Ebrahimi /* SLJIT_HALT_PROCESS must halt the process. */ 853*22dc650dSSadaf Ebrahimi #ifndef SLJIT_HALT_PROCESS 854*22dc650dSSadaf Ebrahimi #define SLJIT_HALT_PROCESS() \ 855*22dc650dSSadaf Ebrahimi abort(); 856*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_HALT_PROCESS */ 857*22dc650dSSadaf Ebrahimi 858*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */ 859*22dc650dSSadaf Ebrahimi 860*22dc650dSSadaf Ebrahimi /* Feel free to redefine these two macros. */ 861*22dc650dSSadaf Ebrahimi #ifndef SLJIT_ASSERT 862*22dc650dSSadaf Ebrahimi 863*22dc650dSSadaf Ebrahimi #define SLJIT_ASSERT(x) \ 864*22dc650dSSadaf Ebrahimi do { \ 865*22dc650dSSadaf Ebrahimi if (SLJIT_UNLIKELY(!(x))) { \ 866*22dc650dSSadaf Ebrahimi printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \ 867*22dc650dSSadaf Ebrahimi SLJIT_HALT_PROCESS(); \ 868*22dc650dSSadaf Ebrahimi } \ 869*22dc650dSSadaf Ebrahimi } while (0) 870*22dc650dSSadaf Ebrahimi 871*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_ASSERT */ 872*22dc650dSSadaf Ebrahimi 873*22dc650dSSadaf Ebrahimi #ifndef SLJIT_UNREACHABLE 874*22dc650dSSadaf Ebrahimi 875*22dc650dSSadaf Ebrahimi #define SLJIT_UNREACHABLE() \ 876*22dc650dSSadaf Ebrahimi do { \ 877*22dc650dSSadaf Ebrahimi printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \ 878*22dc650dSSadaf Ebrahimi SLJIT_HALT_PROCESS(); \ 879*22dc650dSSadaf Ebrahimi } while (0) 880*22dc650dSSadaf Ebrahimi 881*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_UNREACHABLE */ 882*22dc650dSSadaf Ebrahimi 883*22dc650dSSadaf Ebrahimi #else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ 884*22dc650dSSadaf Ebrahimi 885*22dc650dSSadaf Ebrahimi /* Forcing empty, but valid statements. */ 886*22dc650dSSadaf Ebrahimi #undef SLJIT_ASSERT 887*22dc650dSSadaf Ebrahimi #undef SLJIT_UNREACHABLE 888*22dc650dSSadaf Ebrahimi 889*22dc650dSSadaf Ebrahimi #define SLJIT_ASSERT(x) \ 890*22dc650dSSadaf Ebrahimi do { } while (0) 891*22dc650dSSadaf Ebrahimi #define SLJIT_UNREACHABLE() \ 892*22dc650dSSadaf Ebrahimi do { } while (0) 893*22dc650dSSadaf Ebrahimi 894*22dc650dSSadaf Ebrahimi #endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ 895*22dc650dSSadaf Ebrahimi 896*22dc650dSSadaf Ebrahimi #ifndef SLJIT_COMPILE_ASSERT 897*22dc650dSSadaf Ebrahimi 898*22dc650dSSadaf Ebrahimi #define SLJIT_COMPILE_ASSERT(x, description) \ 899*22dc650dSSadaf Ebrahimi switch(0) { case 0: case ((x) ? 1 : 0): break; } 900*22dc650dSSadaf Ebrahimi 901*22dc650dSSadaf Ebrahimi #endif /* !SLJIT_COMPILE_ASSERT */ 902*22dc650dSSadaf Ebrahimi 903*22dc650dSSadaf Ebrahimi #ifdef __cplusplus 904*22dc650dSSadaf Ebrahimi } /* extern "C" */ 905*22dc650dSSadaf Ebrahimi #endif 906*22dc650dSSadaf Ebrahimi 907*22dc650dSSadaf Ebrahimi #endif /* SLJIT_CONFIG_INTERNAL_H_ */ 908