xref: /aosp_15_r20/external/pcre/src/sljit/sljitConfigInternal.h (revision 22dc650d8ae982c6770746019a6f94af92b0f024)
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