Path: blob/master/thirdparty/pcre2/deps/sljit/sljit_src/sljitConfigInternal.h
22364 views
/*1* Stack-less Just-In-Time compiler2*3* Copyright Zoltan Herczeg ([email protected]). All rights reserved.4*5* Redistribution and use in source and binary forms, with or without modification, are6* permitted provided that the following conditions are met:7*8* 1. Redistributions of source code must retain the above copyright notice, this list of9* conditions and the following disclaimer.10*11* 2. Redistributions in binary form must reproduce the above copyright notice, this list12* of conditions and the following disclaimer in the documentation and/or other materials13* provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY16* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES17* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT18* SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,19* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED20* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR21* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN22* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN23* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.24*/2526#ifndef SLJIT_CONFIG_INTERNAL_H_27#define SLJIT_CONFIG_INTERNAL_H_2829/*30SLJIT defines the following architecture dependent types and macros:3132Types:33sljit_s8, sljit_u8 : signed and unsigned 8 bit integer type34sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type35sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type36sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer37sljit_sp, sljit_up : signed and unsigned pointer value (usually the same as38sljit_uw, but some 64 bit ABIs may use 32 bit pointers)39sljit_f32 : 32 bit single precision floating point value40sljit_f64 : 64 bit double precision floating point value4142Macros for feature detection (boolean):43SLJIT_32BIT_ARCHITECTURE : 32 bit architecture44SLJIT_64BIT_ARCHITECTURE : 64 bit architecture45SLJIT_LITTLE_ENDIAN : little endian architecture46SLJIT_BIG_ENDIAN : big endian architecture47SLJIT_UNALIGNED : unaligned memory accesses for non-fpu operations are supported48SLJIT_FPU_UNALIGNED : unaligned memory accesses for fpu operations are supported49SLJIT_MASKED_SHIFT : all word shifts are always masked50SLJIT_MASKED_SHIFT32 : all 32 bit shifts are always masked51SLJIT_INDIRECT_CALL : see SLJIT_FUNC_ADDR() for more information52SLJIT_UPPER_BITS_IGNORED : 32 bit operations ignores the upper bits of source registers53SLJIT_UPPER_BITS_ZERO_EXTENDED : 32 bit operations clears the upper bits of destination registers54SLJIT_UPPER_BITS_SIGN_EXTENDED : 32 bit operations replicates the sign bit in the upper bits of destination registers55SLJIT_UPPER_BITS_PRESERVED : 32 bit operations preserves the upper bits of destination registers5657Constants:58SLJIT_NUMBER_OF_REGISTERS : number of available registers59SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers60SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers61SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers62SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available scratch floating point registers63SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available saved floating point registers64SLJIT_NUMBER_OF_VECTOR_REGISTERS : number of available vector registers65SLJIT_NUMBER_OF_SCRATCH_VECTOR_REGISTERS : number of available scratch vector registers66SLJIT_NUMBER_OF_SAVED_VECTOR_REGISTERS : number of available saved vector registers67SLJIT_NUMBER_OF_TEMPORARY_REGISTERS : number of available temporary registers68SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS : number of available temporary floating point registers69SLJIT_NUMBER_OF_TEMPORARY_VECTOR_REGISTERS : number of available temporary vector registers70SLJIT_SEPARATE_VECTOR_REGISTERS : if this macro is defined, the vector registers do not71overlap with floating point registers72SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index73SLJIT_POINTER_SHIFT : the shift required to apply when accessing a sljit_sp/sljit_up array by index74SLJIT_F32_SHIFT : the shift required to apply when accessing75a single precision floating point array by index76SLJIT_F64_SHIFT : the shift required to apply when accessing77a double precision floating point array by index78SLJIT_PREF_SHIFT_REG : x86 systems prefers ecx for shifting by register79the scratch register index of ecx is stored in this variable80SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)81SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address82SLJIT_CONV_MAX_FLOAT : result when a floating point value is converted to integer83and the floating point value is higher than the maximum integer value84(possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)85SLJIT_CONV_MIN_FLOAT : result when a floating point value is converted to integer86and the floating point value is lower than the minimum integer value87(possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)88SLJIT_CONV_NAN_FLOAT : result when a NaN floating point value is converted to integer89(possible values: SLJIT_CONV_RESULT_MAX_INT, SLJIT_CONV_RESULT_MIN_INT,90or SLJIT_CONV_RESULT_ZERO)9192Other macros:93SLJIT_TMP_R0 .. R9 : accessing temporary registers94SLJIT_TMP_R(i) : accessing temporary registers95SLJIT_TMP_FR0 .. FR9 : accessing temporary floating point registers96SLJIT_TMP_FR(i) : accessing temporary floating point registers97SLJIT_TMP_VR0 .. VR9 : accessing temporary vector registers98SLJIT_TMP_VR(i) : accessing temporary vector registers99SLJIT_TMP_DEST_REG : a temporary register for results, see the rules below100SLJIT_TMP_DEST_FREG : a temporary register for float results, see the rules below101SLJIT_TMP_DEST_VREG : a temporary register for vector results, see the rules below102SLJIT_TMP_OPT_REG : a temporary register which might not be defined, see the rules below103SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT104SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper)105SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit106floating point register when SLJIT_HAS_F64_AS_F32_PAIR returns non-zero107108Temporary register rules (e.g. SLJIT_TMP_DEST_REG / SLJIT_TMP_OPT_REG):109Sljit tries to emit instructions without using any temporary registers whenever it is possible.110When a single temporary register is needed, it is always the "OPT" register. When two temporary111registers are needed, both the "DEST" and "OPT" are used. The x86-32 does not define an "OPT"112register, and handles all cases without an "OPT" register which requires an "OPT" register113on other architectures.114*/115116#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \117|| (defined SLJIT_DEBUG && SLJIT_DEBUG && (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)))118#include <stdio.h>119#endif120121#if (defined SLJIT_DEBUG && SLJIT_DEBUG \122&& (!defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) || !defined(SLJIT_HALT_PROCESS)))123#include <stdlib.h>124#endif125126#ifdef __cplusplus127extern "C" {128#endif129130/***********************************************************/131/* Intel Control-flow Enforcement Technology (CET) spport. */132/***********************************************************/133134#ifdef SLJIT_CONFIG_X86135136#if defined(__CET__) && !(defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET)137#define SLJIT_CONFIG_X86_CET 1138#endif139140#if (defined SLJIT_CONFIG_X86_CET && SLJIT_CONFIG_X86_CET) && defined(__GNUC__)141#include <x86intrin.h>142#endif143144#endif /* SLJIT_CONFIG_X86 */145146/**********************************/147/* External function definitions. */148/**********************************/149150/* General macros:151Note: SLJIT is designed to be independent from them as possible.152153In release mode (SLJIT_DEBUG is not defined) only the following154external functions are needed:155*/156157#ifndef SLJIT_MALLOC158#define SLJIT_MALLOC(size, allocator_data) (malloc(size))159#endif160161#ifndef SLJIT_FREE162#define SLJIT_FREE(ptr, allocator_data) (free(ptr))163#endif164165#ifndef SLJIT_MEMCPY166#define SLJIT_MEMCPY(dest, src, len) (memcpy(dest, src, len))167#endif168169#ifndef SLJIT_MEMMOVE170#define SLJIT_MEMMOVE(dest, src, len) (memmove(dest, src, len))171#endif172173#ifndef SLJIT_ZEROMEM174#define SLJIT_ZEROMEM(dest, len) (memset(dest, 0, len))175#endif176177/***************************/178/* Compiler helper macros. */179/***************************/180181#if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)182183#if defined(__GNUC__) && (__GNUC__ >= 3)184#define SLJIT_LIKELY(x) __builtin_expect((x), 1)185#define SLJIT_UNLIKELY(x) __builtin_expect((x), 0)186#else187#define SLJIT_LIKELY(x) (x)188#define SLJIT_UNLIKELY(x) (x)189#endif190191#endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */192193#ifndef SLJIT_INLINE194/* Inline functions. Some old compilers do not support them. */195#ifdef __SUNPRO_C196#if __SUNPRO_C < 0x560197#define SLJIT_INLINE198#else199#define SLJIT_INLINE inline200#endif /* __SUNPRO_C */201#else202#define SLJIT_INLINE __inline203#endif204#endif /* !SLJIT_INLINE */205206#ifndef SLJIT_NOINLINE207/* Not inline functions. */208#if defined(__GNUC__)209#define SLJIT_NOINLINE __attribute__ ((noinline))210#else211#define SLJIT_NOINLINE212#endif213#endif /* !SLJIT_INLINE */214215#ifndef SLJIT_UNUSED_ARG216/* Unused arguments. */217#define SLJIT_UNUSED_ARG(arg) (void)arg218#endif219220/*********************************/221/* Type of public API functions. */222/*********************************/223224#ifndef SLJIT_API_FUNC_ATTRIBUTE225#if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)226/* Static ABI functions. For all-in-one programs. */227228#if defined(__GNUC__)229/* Disable unused warnings in gcc. */230#define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))231#else232#define SLJIT_API_FUNC_ATTRIBUTE static233#endif234235#else236#define SLJIT_API_FUNC_ATTRIBUTE237#endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */238#endif /* defined SLJIT_API_FUNC_ATTRIBUTE */239240/****************************/241/* Instruction cache flush. */242/****************************/243244#ifdef __APPLE__245#include <AvailabilityMacros.h>246#endif247248/*249* TODO:250*251* clang >= 15 could be safe to enable below252* older versions are known to abort in some targets253* https://github.com/PhilipHazel/pcre2/issues/92254*255* beware some vendors (ex: Microsoft, Apple) are known to have256* removed the code to support this builtin even if the call for257* __has_builtin reports it is available.258*259* make sure linking doesn't fail because __clear_cache() is260* missing before changing it or add an exception so that the261* system provided method that should be defined below is used262* instead.263*/264#if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)265#if __has_builtin(__builtin___clear_cache) && !defined(__clang__)266267/*268* https://gcc.gnu.org/bugzilla//show_bug.cgi?id=91248269* https://gcc.gnu.org/bugzilla//show_bug.cgi?id=93811270* gcc's clear_cache builtin for power is broken271*/272#if !defined(SLJIT_CONFIG_PPC)273#define SLJIT_CACHE_FLUSH(from, to) \274__builtin___clear_cache((char*)(from), (char*)(to))275#endif276277#endif /* gcc >= 10 */278#endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */279280#ifndef SLJIT_CACHE_FLUSH281282#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \283|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)284285/* Not required to implement on archs with unified caches. */286#define SLJIT_CACHE_FLUSH(from, to)287288#elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050289290/* Supported by all macs since Mac OS 10.5.291However, it does not work on non-jailbroken iOS devices,292although the compilation is successful. */293#include <libkern/OSCacheControl.h>294#define SLJIT_CACHE_FLUSH(from, to) \295sys_icache_invalidate((void*)(from), (size_t)((char*)(to) - (char*)(from)))296297#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)298299/* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */300#define SLJIT_CACHE_FLUSH(from, to) \301ppc_cache_flush((from), (to))302#define SLJIT_CACHE_FLUSH_OWN_IMPL 1303304#elif defined(_WIN32)305306#define SLJIT_CACHE_FLUSH(from, to) \307FlushInstructionCache(GetCurrentProcess(), (void*)(from), (size_t)((char*)(to) - (char*)(from)))308309#elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || defined(__clang__)310311#define SLJIT_CACHE_FLUSH(from, to) \312__builtin___clear_cache((char*)(from), (char*)(to))313314#elif defined __ANDROID__315316/* Android ARMv7 with gcc lacks __clear_cache; use cacheflush instead. */317#include <sys/cachectl.h>318#define SLJIT_CACHE_FLUSH(from, to) \319cacheflush((long)(from), (long)(to), 0)320321#else322323/* Call __ARM_NR_cacheflush on ARM-Linux or the corresponding MIPS syscall. */324#define SLJIT_CACHE_FLUSH(from, to) \325__clear_cache((char*)(from), (char*)(to))326327#endif328329#endif /* !SLJIT_CACHE_FLUSH */330331/******************************************************/332/* Integer and floating point type definitions. */333/******************************************************/334335/* 8 bit byte type. */336typedef unsigned char sljit_u8;337typedef signed char sljit_s8;338339/* 16 bit half-word type. */340typedef unsigned short int sljit_u16;341typedef signed short int sljit_s16;342343/* 32 bit integer type. */344typedef unsigned int sljit_u32;345typedef signed int sljit_s32;346347/* Machine word type. Enough for storing a pointer.34832 bit for 32 bit machines.34964 bit for 64 bit machines. */350#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)351/* Just to have something. */352#define SLJIT_WORD_SHIFT 0353typedef unsigned int sljit_uw;354typedef int sljit_sw;355#elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \356&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \357&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \358&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \359&& !(defined SLJIT_CONFIG_RISCV_64 && SLJIT_CONFIG_RISCV_64) \360&& !(defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \361&& !(defined SLJIT_CONFIG_LOONGARCH_64 && SLJIT_CONFIG_LOONGARCH_64)362#define SLJIT_32BIT_ARCHITECTURE 1363#define SLJIT_WORD_SHIFT 2364typedef unsigned int sljit_uw;365typedef int sljit_sw;366#else367#define SLJIT_64BIT_ARCHITECTURE 1368#define SLJIT_WORD_SHIFT 3369#ifdef _WIN32370#ifdef __GNUC__371/* These types do not require windows.h */372typedef unsigned long long sljit_uw;373typedef long long sljit_sw;374#else375typedef unsigned __int64 sljit_uw;376typedef __int64 sljit_sw;377#endif378#else /* !_WIN32 */379typedef unsigned long int sljit_uw;380typedef long int sljit_sw;381#endif /* _WIN32 */382#endif383384typedef sljit_sw sljit_sp;385typedef sljit_uw sljit_up;386387/* Floating point types. */388typedef float sljit_f32;389typedef double sljit_f64;390391/* Shift for pointer sized data. */392#define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT393394/* Shift for double precision sized data. */395#define SLJIT_F32_SHIFT 2396#define SLJIT_F64_SHIFT 3397398#define SLJIT_CONV_RESULT_MAX_INT 0399#define SLJIT_CONV_RESULT_MIN_INT 1400#define SLJIT_CONV_RESULT_ZERO 2401402#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)403#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MIN_INT404#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT405#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT406#elif (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)407#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT408#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT409#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO410#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)411#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT412#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MAX_INT413#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT414#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)415#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT416#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT417#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT418#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)419#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT420#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT421#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT422#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)423#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT424#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT425#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT426#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)427#define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT428#define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT429#define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO430#else431#error "Result for float to integer conversion is not defined"432#endif433434#ifndef SLJIT_W435436/* Defining long constants. */437#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)438#ifdef _WIN64439#define SLJIT_W(w) (w##ll)440#else /* !windows */441#define SLJIT_W(w) (w##l)442#endif /* windows */443#else /* 32 bit */444#define SLJIT_W(w) (w)445#endif /* unknown */446447#endif /* !SLJIT_W */448449/*************************/450/* Endianness detection. */451/*************************/452453#if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)454455/* These macros are mostly useful for the applications. */456#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)457458#ifdef __LITTLE_ENDIAN__459#define SLJIT_LITTLE_ENDIAN 1460#else461#define SLJIT_BIG_ENDIAN 1462#endif463464#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)465466#ifdef __MIPSEL__467#define SLJIT_LITTLE_ENDIAN 1468#else469#define SLJIT_BIG_ENDIAN 1470#endif471472#ifndef SLJIT_MIPS_REV473474/* Auto detecting mips revision. */475#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6)476#define SLJIT_MIPS_REV 6477#elif defined(__mips_isa_rev) && __mips_isa_rev >= 1478#define SLJIT_MIPS_REV __mips_isa_rev479#elif defined(__clang__) \480&& (defined(_MIPS_ARCH_OCTEON) || defined(_MIPS_ARCH_P5600))481/* clang either forgets to define (clang-7) __mips_isa_rev at all482* or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+)483* and -march=p5600 (MIPS32 R5).484* It also sets the __mips macro to 64 or 32 for -mipsN when N <= 5485* (should be set to N exactly) so we cannot rely on this too.486*/487#define SLJIT_MIPS_REV 1488#endif489490#endif /* !SLJIT_MIPS_REV */491492#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)493494#define SLJIT_BIG_ENDIAN 1495496#else497#define SLJIT_LITTLE_ENDIAN 1498#endif499500#endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */501502/* Sanity check. */503#if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)504#error "Exactly one endianness must be selected"505#endif506507#if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)508#error "Exactly one endianness must be selected"509#endif510511#ifndef SLJIT_UNALIGNED512513#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \514|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \515|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \516|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \517|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \518|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \519|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \520|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)521#define SLJIT_UNALIGNED 1522#endif523524#endif /* !SLJIT_UNALIGNED */525526#ifndef SLJIT_FPU_UNALIGNED527528#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \529|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \530|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \531|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \532|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \533|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)534#define SLJIT_FPU_UNALIGNED 1535#endif536537#endif /* !SLJIT_FPU_UNALIGNED */538539#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)540/* Auto detect SSE2 support using CPUID.541On 64 bit x86 cpus, sse2 must be present. */542#define SLJIT_DETECT_SSE2 1543#endif544545/*****************************************************************************************/546/* Calling convention of functions generated by SLJIT or called from the generated code. */547/*****************************************************************************************/548549#ifndef SLJIT_FUNC550#define SLJIT_FUNC551#endif /* !SLJIT_FUNC */552553#ifndef SLJIT_INDIRECT_CALL554#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \555|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)556/* It seems certain ppc compilers use an indirect addressing for functions557which makes things complicated. */558#define SLJIT_INDIRECT_CALL 1559#endif560#endif /* SLJIT_INDIRECT_CALL */561562/* The offset which needs to be subtracted from the return address to563determine the next executed instruction after return. */564#ifndef SLJIT_RETURN_ADDRESS_OFFSET565#define SLJIT_RETURN_ADDRESS_OFFSET 0566#endif /* SLJIT_RETURN_ADDRESS_OFFSET */567568/***************************************************/569/* Functions of the built-in executable allocator. */570/***************************************************/571572#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)573SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);574SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);575/* Note: sljitLir.h also defines sljit_free_unused_memory_exec() function. */576#define SLJIT_BUILTIN_MALLOC_EXEC(size, exec_allocator_data) sljit_malloc_exec(size)577#define SLJIT_BUILTIN_FREE_EXEC(ptr, exec_allocator_data) sljit_free_exec(ptr)578579#ifndef SLJIT_MALLOC_EXEC580#define SLJIT_MALLOC_EXEC(size, exec_allocator_data) SLJIT_BUILTIN_MALLOC_EXEC((size), (exec_allocator_data))581#endif /* SLJIT_MALLOC_EXEC */582583#ifndef SLJIT_FREE_EXEC584#define SLJIT_FREE_EXEC(ptr, exec_allocator_data) SLJIT_BUILTIN_FREE_EXEC((ptr), (exec_allocator_data))585#endif /* SLJIT_FREE_EXEC */586587#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)588SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void *code);589#define SLJIT_EXEC_OFFSET(code) sljit_exec_offset(code)590#endif /* SLJIT_PROT_EXECUTABLE_ALLOCATOR */591592#endif /* SLJIT_EXECUTABLE_ALLOCATOR */593594#ifndef SLJIT_EXEC_OFFSET595#define SLJIT_EXEC_OFFSET(ptr) 0596#endif597598/**********************************************/599/* Registers and locals offset determination. */600/**********************************************/601602#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)603604#define SLJIT_NUMBER_OF_REGISTERS 12605#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7606#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 1607#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 7608#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0609#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1610#define SLJIT_TMP_DEST_REG SLJIT_TMP_R0611#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0612#define SLJIT_LOCALS_OFFSET_BASE (8 * (sljit_s32)sizeof(sljit_sw))613#define SLJIT_PREF_SHIFT_REG SLJIT_R2614#define SLJIT_MASKED_SHIFT 1615#define SLJIT_MASKED_SHIFT32 1616#define SLJIT_UPPER_BITS_IGNORED 1617#define SLJIT_UPPER_BITS_ZERO_EXTENDED 1618619#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)620621#define SLJIT_NUMBER_OF_REGISTERS 13622#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2623#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15624#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1625#ifndef _WIN64626#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6627#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0628#define SLJIT_LOCALS_OFFSET_BASE 0629#else /* _WIN64 */630#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8631#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 10632#define SLJIT_LOCALS_OFFSET_BASE (4 * (sljit_s32)sizeof(sljit_sw))633#endif /* !_WIN64 */634#define SLJIT_TMP_DEST_REG SLJIT_TMP_R0635#define SLJIT_TMP_OPT_REG SLJIT_TMP_R1636#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0637#define SLJIT_PREF_SHIFT_REG SLJIT_R3638#define SLJIT_MASKED_SHIFT 1639#define SLJIT_MASKED_SHIFT32 1640#define SLJIT_UPPER_BITS_IGNORED 1641#define SLJIT_UPPER_BITS_ZERO_EXTENDED 1642643#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32)644645#define SLJIT_NUMBER_OF_REGISTERS 12646#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8647#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2648#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14649#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8650#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2651#define SLJIT_TMP_DEST_REG SLJIT_TMP_R1652#define SLJIT_TMP_OPT_REG SLJIT_TMP_R0653#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0654#define SLJIT_LOCALS_OFFSET_BASE 0655656#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)657658#define SLJIT_NUMBER_OF_REGISTERS 26659#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10660#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3661#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30662#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8663#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2664#define SLJIT_TMP_DEST_REG SLJIT_TMP_R0665#define SLJIT_TMP_OPT_REG SLJIT_TMP_R1666#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0667#define SLJIT_LOCALS_OFFSET_BASE (2 * (sljit_s32)sizeof(sljit_sw))668#define SLJIT_MASKED_SHIFT 1669#define SLJIT_MASKED_SHIFT32 1670#define SLJIT_UPPER_BITS_IGNORED 1671#define SLJIT_UPPER_BITS_ZERO_EXTENDED 1672673#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)674675#define SLJIT_NUMBER_OF_REGISTERS 23676#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17677#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3678#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30679#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 18680#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2681#define SLJIT_TMP_DEST_REG SLJIT_TMP_R1682#define SLJIT_TMP_OPT_REG SLJIT_TMP_R0683#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0684#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)685#define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * (sljit_s32)sizeof(sljit_sw))686#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)687/* Add +1 for double alignment. */688#define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * (sljit_s32)sizeof(sljit_sw))689#else690#define SLJIT_LOCALS_OFFSET_BASE (3 * (sljit_s32)sizeof(sljit_sw))691#endif /* SLJIT_CONFIG_PPC_64 || _AIX */692#define SLJIT_UPPER_BITS_IGNORED 1693694#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)695696#define SLJIT_NUMBER_OF_REGISTERS 21697#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8698#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)699#define SLJIT_LOCALS_OFFSET_BASE (4 * (sljit_s32)sizeof(sljit_sw))700#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 13701#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 6702#else703#define SLJIT_LOCALS_OFFSET_BASE 0704#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 29705#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8706#endif707#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5708#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 3709#define SLJIT_TMP_DEST_REG SLJIT_TMP_R1710#define SLJIT_TMP_OPT_REG SLJIT_TMP_R0711#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0712#define SLJIT_MASKED_SHIFT 1713#define SLJIT_MASKED_SHIFT32 1714#define SLJIT_UPPER_BITS_SIGN_EXTENDED 1715716#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV)717718#define SLJIT_NUMBER_OF_REGISTERS 23719#define SLJIT_NUMBER_OF_SAVED_REGISTERS 12720#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5721#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30722#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12723#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2724#define SLJIT_SEPARATE_VECTOR_REGISTERS 1725#define SLJIT_NUMBER_OF_VECTOR_REGISTERS 30726#define SLJIT_NUMBER_OF_SAVED_VECTOR_REGISTERS 0727#define SLJIT_NUMBER_OF_TEMPORARY_VECTOR_REGISTERS 2728#define SLJIT_TMP_DEST_REG SLJIT_TMP_R1729#define SLJIT_TMP_OPT_REG SLJIT_TMP_R0730#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0731#define SLJIT_TMP_DEST_VREG SLJIT_TMP_VR0732#define SLJIT_LOCALS_OFFSET_BASE 0733#define SLJIT_MASKED_SHIFT 1734#define SLJIT_MASKED_SHIFT32 1735#define SLJIT_UPPER_BITS_IGNORED 1736#define SLJIT_UPPER_BITS_SIGN_EXTENDED 1737738#elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)739740/*741* https://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html#STACKFRAME742*743* 160744* .. FR6745* .. FR4746* .. FR2747* 128 FR0748* 120 R15 (used for SP)749* 112 R14750* 104 R13751* 96 R12752* ..753* 48 R6754* ..755* 16 R2756* 8 RESERVED757* 0 SP758*/759#define SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE 160760761#define SLJIT_NUMBER_OF_REGISTERS 12762#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8763#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3764#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15765#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8766#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1767#define SLJIT_TMP_DEST_REG SLJIT_TMP_R2768#define SLJIT_TMP_OPT_REG SLJIT_TMP_R1769#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0770#define SLJIT_LOCALS_OFFSET_BASE SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE771#define SLJIT_MASKED_SHIFT 1772#define SLJIT_UPPER_BITS_IGNORED 1773#define SLJIT_UPPER_BITS_PRESERVED 1774775#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)776777#define SLJIT_NUMBER_OF_REGISTERS 23778#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10779#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5780#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30781#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12782#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2783#define SLJIT_TMP_DEST_REG SLJIT_TMP_R1784#define SLJIT_TMP_OPT_REG SLJIT_TMP_R0785#define SLJIT_TMP_DEST_FREG SLJIT_TMP_FR0786#define SLJIT_LOCALS_OFFSET_BASE 0787#define SLJIT_MASKED_SHIFT 1788#define SLJIT_MASKED_SHIFT32 1789#define SLJIT_UPPER_BITS_SIGN_EXTENDED 1790791#elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)792793/* Just to have something. */794#define SLJIT_NUMBER_OF_REGISTERS 0795#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0796#define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 0797#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 0798#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0799#define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 0800#define SLJIT_TMP_DEST_REG 0801#define SLJIT_TMP_DEST_FREG 0802#define SLJIT_LOCALS_OFFSET_BASE 0803804#endif805806#if !(defined SLJIT_SEPARATE_VECTOR_REGISTERS && SLJIT_SEPARATE_VECTOR_REGISTERS)807#define SLJIT_NUMBER_OF_VECTOR_REGISTERS (SLJIT_NUMBER_OF_FLOAT_REGISTERS)808#define SLJIT_NUMBER_OF_SAVED_VECTOR_REGISTERS (SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)809#define SLJIT_NUMBER_OF_TEMPORARY_VECTOR_REGISTERS (SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)810#define SLJIT_TMP_DEST_VREG (SLJIT_TMP_DEST_FREG)811#endif /* !SLJIT_SEPARATE_VECTOR_REGISTERS */812813#define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)814815#define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \816(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)817818#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \819(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)820821#define SLJIT_NUMBER_OF_SCRATCH_VECTOR_REGISTERS \822(SLJIT_NUMBER_OF_VECTOR_REGISTERS - SLJIT_NUMBER_OF_SAVED_VECTOR_REGISTERS)823824#if (defined SLJIT_UPPER_BITS_ZERO_EXTENDED && SLJIT_UPPER_BITS_ZERO_EXTENDED) \825+ (defined SLJIT_UPPER_BITS_SIGN_EXTENDED && SLJIT_UPPER_BITS_SIGN_EXTENDED) \826+ (defined SLJIT_UPPER_BITS_PRESERVED && SLJIT_UPPER_BITS_PRESERVED) > 1827#error "Invalid upper bits defintion"828#endif829830#if (defined SLJIT_UPPER_BITS_PRESERVED && SLJIT_UPPER_BITS_PRESERVED) \831&& !(defined SLJIT_UPPER_BITS_IGNORED && SLJIT_UPPER_BITS_IGNORED)832#error "Upper bits preserved requires bits ignored"833#endif834835/**********************************/836/* Temporary register management. */837/**********************************/838839#define SLJIT_TMP_REGISTER_BASE (SLJIT_NUMBER_OF_REGISTERS + 2)840#define SLJIT_TMP_FREGISTER_BASE (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)841#define SLJIT_TMP_VREGISTER_BASE (SLJIT_NUMBER_OF_VECTOR_REGISTERS + 1)842843/* WARNING: Accessing temporary registers is not recommended, because they844are also used by the JIT compiler for various computations. Using them845might have any side effects including incorrect operations and crashes,846so use them at your own risk. The machine registers themselves might have847limitations, e.g. the r0 register on s390x / ppc cannot be used as848base address for memory operations. */849850/* Temporary registers */851#define SLJIT_TMP_R0 (SLJIT_TMP_REGISTER_BASE + 0)852#define SLJIT_TMP_R1 (SLJIT_TMP_REGISTER_BASE + 1)853#define SLJIT_TMP_R2 (SLJIT_TMP_REGISTER_BASE + 2)854#define SLJIT_TMP_R3 (SLJIT_TMP_REGISTER_BASE + 3)855#define SLJIT_TMP_R4 (SLJIT_TMP_REGISTER_BASE + 4)856#define SLJIT_TMP_R5 (SLJIT_TMP_REGISTER_BASE + 5)857#define SLJIT_TMP_R6 (SLJIT_TMP_REGISTER_BASE + 6)858#define SLJIT_TMP_R7 (SLJIT_TMP_REGISTER_BASE + 7)859#define SLJIT_TMP_R8 (SLJIT_TMP_REGISTER_BASE + 8)860#define SLJIT_TMP_R9 (SLJIT_TMP_REGISTER_BASE + 9)861#define SLJIT_TMP_R(i) (SLJIT_TMP_REGISTER_BASE + (i))862863#define SLJIT_TMP_FR0 (SLJIT_TMP_FREGISTER_BASE + 0)864#define SLJIT_TMP_FR1 (SLJIT_TMP_FREGISTER_BASE + 1)865#define SLJIT_TMP_FR2 (SLJIT_TMP_FREGISTER_BASE + 2)866#define SLJIT_TMP_FR3 (SLJIT_TMP_FREGISTER_BASE + 3)867#define SLJIT_TMP_FR4 (SLJIT_TMP_FREGISTER_BASE + 4)868#define SLJIT_TMP_FR5 (SLJIT_TMP_FREGISTER_BASE + 5)869#define SLJIT_TMP_FR6 (SLJIT_TMP_FREGISTER_BASE + 6)870#define SLJIT_TMP_FR7 (SLJIT_TMP_FREGISTER_BASE + 7)871#define SLJIT_TMP_FR8 (SLJIT_TMP_FREGISTER_BASE + 8)872#define SLJIT_TMP_FR9 (SLJIT_TMP_FREGISTER_BASE + 9)873#define SLJIT_TMP_FR(i) (SLJIT_TMP_FREGISTER_BASE + (i))874875#define SLJIT_TMP_VR0 (SLJIT_TMP_VREGISTER_BASE + 0)876#define SLJIT_TMP_VR1 (SLJIT_TMP_VREGISTER_BASE + 1)877#define SLJIT_TMP_VR2 (SLJIT_TMP_VREGISTER_BASE + 2)878#define SLJIT_TMP_VR3 (SLJIT_TMP_VREGISTER_BASE + 3)879#define SLJIT_TMP_VR4 (SLJIT_TMP_VREGISTER_BASE + 4)880#define SLJIT_TMP_VR5 (SLJIT_TMP_VREGISTER_BASE + 5)881#define SLJIT_TMP_VR6 (SLJIT_TMP_VREGISTER_BASE + 6)882#define SLJIT_TMP_VR7 (SLJIT_TMP_VREGISTER_BASE + 7)883#define SLJIT_TMP_VR8 (SLJIT_TMP_VREGISTER_BASE + 8)884#define SLJIT_TMP_VR9 (SLJIT_TMP_VREGISTER_BASE + 9)885#define SLJIT_TMP_VR(i) (SLJIT_TMP_VREGISTER_BASE + (i))886887/********************************/888/* CPU status flags management. */889/********************************/890891#if (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM) \892|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \893|| (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \894|| (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV) \895|| (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) \896|| (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH)897#define SLJIT_HAS_STATUS_FLAGS_STATE 1898#endif899900/***************************************/901/* Floating point register management. */902/***************************************/903904#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \905|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)906#define SLJIT_F64_SECOND(reg) \907((reg) + SLJIT_FS0 + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS)908#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */909#define SLJIT_F64_SECOND(reg) \910(reg)911#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */912913/*************************************/914/* Debug and verbose related macros. */915/*************************************/916917#if (defined SLJIT_DEBUG && SLJIT_DEBUG)918919#if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)920921/* SLJIT_HALT_PROCESS must halt the process. */922#ifndef SLJIT_HALT_PROCESS923#define SLJIT_HALT_PROCESS() \924abort();925#endif /* !SLJIT_HALT_PROCESS */926927#endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */928929/* Feel free to redefine these two macros. */930#ifndef SLJIT_ASSERT931932#define SLJIT_ASSERT(x) \933do { \934if (SLJIT_UNLIKELY(!(x))) { \935printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \936SLJIT_HALT_PROCESS(); \937} \938} while (0)939940#endif /* !SLJIT_ASSERT */941942#ifndef SLJIT_UNREACHABLE943944#define SLJIT_UNREACHABLE() \945do { \946printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \947SLJIT_HALT_PROCESS(); \948} while (0)949950#endif /* !SLJIT_UNREACHABLE */951952#else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */953954/* Forcing empty, but valid statements. */955#undef SLJIT_ASSERT956#undef SLJIT_UNREACHABLE957958#define SLJIT_ASSERT(x) \959do { } while (0)960#define SLJIT_UNREACHABLE() \961do { } while (0)962963#endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */964965#ifndef SLJIT_COMPILE_ASSERT966967#define SLJIT_COMPILE_ASSERT(x, description) \968switch(0) { case 0: case ((x) ? 1 : 0): break; }969970#endif /* !SLJIT_COMPILE_ASSERT */971972#ifndef SLJIT_FALLTHROUGH973974#if defined(__cplusplus) && __cplusplus >= 202002L && \975defined(__has_cpp_attribute)976/* Standards-compatible C++ variant. */977#if __has_cpp_attribute(fallthrough)978#define SLJIT_FALLTHROUGH [[fallthrough]];979#endif980#elif !defined(__cplusplus) && \981defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L && \982defined(__has_c_attribute)983/* Standards-compatible C variant. */984#if __has_c_attribute(fallthrough)985#define SLJIT_FALLTHROUGH [[fallthrough]];986#endif987#elif ((defined(__clang__) && __clang_major__ >= 10) || \988(defined(__GNUC__) && __GNUC__ >= 7)) && \989defined(__has_attribute)990/* Clang and GCC syntax. Rule out old versions because apparently Clang at991least has a broken implementation of __has_attribute. */992#if __has_attribute(fallthrough)993#define SLJIT_FALLTHROUGH __attribute__((fallthrough));994#endif995#endif996997#ifndef SLJIT_FALLTHROUGH998#define SLJIT_FALLTHROUGH999#endif10001001#endif /* !SLJIT_FALLTHROUGH */10021003#ifdef __cplusplus1004} /* extern "C" */1005#endif10061007#endif /* SLJIT_CONFIG_INTERNAL_H_ */100810091010