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