Skip to content

Commit bbe8042

Browse files
author
Zoltan Herczeg
committed
JIT compiler update
1 parent 5074d60 commit bbe8042

21 files changed

+3652
-1713
lines changed

src/pcre2_jit_compile.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -2272,7 +2272,7 @@ int i;
22722272
for (i = 0; i < RECURSE_TMP_REG_COUNT; i++)
22732273
{
22742274
SLJIT_ASSERT(status->tmp_regs[i] >= 0);
2275-
SLJIT_ASSERT(sljit_get_register_index(SLJIT_INT_REGISTER, status->saved_tmp_regs[i]) < 0 || status->tmp_regs[i] == status->saved_tmp_regs[i]);
2275+
SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, status->saved_tmp_regs[i]) < 0 || status->tmp_regs[i] == status->saved_tmp_regs[i]);
22762276

22772277
status->store_bases[i] = -1;
22782278
}
@@ -2292,7 +2292,7 @@ SLJIT_ASSERT(load_base > 0 && store_base > 0);
22922292
if (status->store_bases[next_tmp_reg] == -1)
22932293
{
22942294
/* Preserve virtual registers. */
2295-
if (sljit_get_register_index(SLJIT_INT_REGISTER, status->saved_tmp_regs[next_tmp_reg]) < 0)
2295+
if (sljit_get_register_index(SLJIT_GP_REGISTER, status->saved_tmp_regs[next_tmp_reg]) < 0)
22962296
OP1(SLJIT_MOV, status->saved_tmp_regs[next_tmp_reg], 0, tmp_reg, 0);
22972297
}
22982298
else
@@ -2321,7 +2321,7 @@ for (i = 0; i < RECURSE_TMP_REG_COUNT; i++)
23212321
OP1(SLJIT_MOV, SLJIT_MEM1(status->store_bases[next_tmp_reg]), status->store_offsets[next_tmp_reg], tmp_reg, 0);
23222322

23232323
/* Restore virtual registers. */
2324-
if (sljit_get_register_index(SLJIT_INT_REGISTER, saved_tmp_reg) < 0)
2324+
if (sljit_get_register_index(SLJIT_GP_REGISTER, saved_tmp_reg) < 0)
23252325
OP1(SLJIT_MOV, tmp_reg, 0, saved_tmp_reg, 0);
23262326
}
23272327

@@ -3250,7 +3250,7 @@ if (size == sizeof(sljit_sw))
32503250
return;
32513251
}
32523252

3253-
if (sljit_get_register_index(SLJIT_INT_REGISTER, TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
3253+
if (sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
32543254
{
32553255
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
32563256
src = TMP3;
@@ -13739,9 +13739,9 @@ jump_list *reqcu_not_found = NULL;
1373913739
SLJIT_ASSERT(tables);
1374013740

1374113741
#if HAS_VIRTUAL_REGISTERS == 1
13742-
SLJIT_ASSERT(sljit_get_register_index(SLJIT_INT_REGISTER, TMP3) < 0 && sljit_get_register_index(SLJIT_INT_REGISTER, ARGUMENTS) < 0 && sljit_get_register_index(SLJIT_INT_REGISTER, RETURN_ADDR) < 0);
13742+
SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) < 0 && sljit_get_register_index(SLJIT_GP_REGISTER, ARGUMENTS) < 0 && sljit_get_register_index(SLJIT_GP_REGISTER, RETURN_ADDR) < 0);
1374313743
#elif HAS_VIRTUAL_REGISTERS == 0
13744-
SLJIT_ASSERT(sljit_get_register_index(SLJIT_INT_REGISTER, TMP3) >= 0 && sljit_get_register_index(SLJIT_INT_REGISTER, ARGUMENTS) >= 0 && sljit_get_register_index(SLJIT_INT_REGISTER, RETURN_ADDR) >= 0);
13744+
SLJIT_ASSERT(sljit_get_register_index(SLJIT_GP_REGISTER, TMP3) >= 0 && sljit_get_register_index(SLJIT_GP_REGISTER, ARGUMENTS) >= 0 && sljit_get_register_index(SLJIT_GP_REGISTER, RETURN_ADDR) >= 0);
1374513745
#else
1374613746
#error "Invalid value for HAS_VIRTUAL_REGISTERS"
1374713747
#endif

src/pcre2_jit_simd_inc.h

+25-25
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ switch (step)
201201
}
202202
}
203203

204-
#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
204+
#define JIT_HAS_FAST_FORWARD_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_FPU))
205205

206206
static void fast_forward_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2, sljit_s32 offset)
207207
{
@@ -214,8 +214,8 @@ struct sljit_label *restart;
214214
struct sljit_jump *quit;
215215
struct sljit_jump *partial_quit[2];
216216
vector_compare_type compare_type = vector_compare_match1;
217-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
218-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
217+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
218+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
219219
sljit_s32 data_ind = 0;
220220
sljit_s32 tmp_ind = 1;
221221
sljit_s32 cmp1_ind = 2;
@@ -365,7 +365,7 @@ if (common->utf && offset > 0)
365365
#endif
366366
}
367367

368-
#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
368+
#define JIT_HAS_FAST_REQUESTED_CHAR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_FPU))
369369

370370
static jump_list *fast_requested_char_simd(compiler_common *common, PCRE2_UCHAR char1, PCRE2_UCHAR char2)
371371
{
@@ -375,8 +375,8 @@ struct sljit_label *start;
375375
struct sljit_jump *quit;
376376
jump_list *not_found = NULL;
377377
vector_compare_type compare_type = vector_compare_match1;
378-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
379-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
378+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
379+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
380380
sljit_s32 data_ind = 0;
381381
sljit_s32 tmp_ind = 1;
382382
sljit_s32 cmp1_ind = 2;
@@ -497,7 +497,7 @@ return not_found;
497497

498498
#ifndef _WIN64
499499

500-
#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_SSE2))
500+
#define JIT_HAS_FAST_FORWARD_CHAR_PAIR_SIMD (sljit_has_cpu_feature(SLJIT_HAS_FPU))
501501

502502
static void fast_forward_char_pair_simd(compiler_common *common, sljit_s32 offs1,
503503
PCRE2_UCHAR char1a, PCRE2_UCHAR char1b, sljit_s32 offs2, PCRE2_UCHAR char2a, PCRE2_UCHAR char2b)
@@ -509,9 +509,9 @@ vector_compare_type compare2_type = vector_compare_match1;
509509
sljit_u32 bit1 = 0;
510510
sljit_u32 bit2 = 0;
511511
sljit_u32 diff = IN_UCHARS(offs1 - offs2);
512-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
513-
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP2);
514-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
512+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
513+
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP2);
514+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
515515
sljit_s32 data1_ind = 0;
516516
sljit_s32 data2_ind = 1;
517517
sljit_s32 tmp1_ind = 2;
@@ -1183,7 +1183,7 @@ if (step == 0)
11831183
OP1(SLJIT_MOV, tmp_general_reg, 0, SLJIT_IMM, chr);
11841184

11851185
/* VLVG */
1186-
instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | sljit_get_register_index(SLJIT_INT_REGISTER, tmp_general_reg));
1186+
instruction[0] = (sljit_u16)(0xe700 | (dst_vreg << 4) | sljit_get_register_index(SLJIT_GP_REGISTER, tmp_general_reg));
11871187
instruction[1] = 0;
11881188
instruction[2] = (sljit_u16)((VECTOR_ELEMENT_SIZE << 12) | (0x8 << 8) | 0x22);
11891189
sljit_emit_op_custom(compiler, instruction, 6);
@@ -1262,8 +1262,8 @@ struct sljit_label *restart;
12621262
struct sljit_jump *quit;
12631263
struct sljit_jump *partial_quit[2];
12641264
vector_compare_type compare_type = vector_compare_match1;
1265-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
1266-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
1265+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
1266+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
12671267
sljit_s32 data_ind = 0;
12681268
sljit_s32 tmp_ind = 1;
12691269
sljit_s32 cmp1_ind = 2;
@@ -1460,8 +1460,8 @@ struct sljit_label *start;
14601460
struct sljit_jump *quit;
14611461
jump_list *not_found = NULL;
14621462
vector_compare_type compare_type = vector_compare_match1;
1463-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
1464-
sljit_s32 tmp3_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP3);
1463+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
1464+
sljit_s32 tmp3_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP3);
14651465
sljit_s32 data_ind = 0;
14661466
sljit_s32 tmp_ind = 1;
14671467
sljit_s32 cmp1_ind = 2;
@@ -1630,9 +1630,9 @@ vector_compare_type compare2_type = vector_compare_match1;
16301630
sljit_u32 bit1 = 0;
16311631
sljit_u32 bit2 = 0;
16321632
sljit_s32 diff = IN_UCHARS(offs2 - offs1);
1633-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
1634-
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP2);
1635-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
1633+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
1634+
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP2);
1635+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
16361636
sljit_s32 data1_ind = 0;
16371637
sljit_s32 data2_ind = 1;
16381638
sljit_s32 tmp1_ind = 2;
@@ -1949,8 +1949,8 @@ struct sljit_label *restart;
19491949
struct sljit_jump *quit;
19501950
struct sljit_jump *partial_quit[2];
19511951
vector_compare_type compare_type = vector_compare_match1;
1952-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
1953-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
1952+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
1953+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
19541954
sljit_s32 data_ind = 0;
19551955
sljit_s32 tmp_ind = 1;
19561956
sljit_s32 cmp1_ind = 2;
@@ -2082,8 +2082,8 @@ struct sljit_label *start;
20822082
struct sljit_jump *quit;
20832083
jump_list *not_found = NULL;
20842084
vector_compare_type compare_type = vector_compare_match1;
2085-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
2086-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
2085+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
2086+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
20872087
sljit_s32 data_ind = 0;
20882088
sljit_s32 tmp_ind = 1;
20892089
sljit_s32 cmp1_ind = 2;
@@ -2183,9 +2183,9 @@ vector_compare_type compare2_type = vector_compare_match1;
21832183
sljit_u32 bit1 = 0;
21842184
sljit_u32 bit2 = 0;
21852185
sljit_u32 diff = IN_UCHARS(offs1 - offs2);
2186-
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP1);
2187-
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, TMP2);
2188-
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_INT_REGISTER, STR_PTR);
2186+
sljit_s32 tmp1_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP1);
2187+
sljit_s32 tmp2_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, TMP2);
2188+
sljit_s32 str_ptr_reg_ind = sljit_get_register_index(SLJIT_GP_REGISTER, STR_PTR);
21892189
sljit_s32 data1_ind = 0;
21902190
sljit_s32 data2_ind = 1;
21912191
sljit_s32 tmp1_ind = 2;

src/sljit/allocator_src/sljitExecAllocatorApple.c

+24-8
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,18 @@
3333
On non-macOS systems, returns MAP_JIT if it is defined.
3434
*/
3535
#include <TargetConditionals.h>
36-
#if TARGET_OS_OSX
37-
#if defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86
36+
37+
#if (defined(TARGET_OS_OSX) && TARGET_OS_OSX) || (TARGET_OS_MAC && !TARGET_OS_IPHONE)
38+
39+
#if defined(SLJIT_CONFIG_X86) && SLJIT_CONFIG_X86
40+
3841
#include <sys/utsname.h>
3942
#include <stdlib.h>
4043

4144
#define SLJIT_MAP_JIT (get_map_jit_flag())
4245
#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
4346

44-
static SLJIT_INLINE int get_map_jit_flag()
47+
static SLJIT_INLINE int get_map_jit_flag(void)
4548
{
4649
size_t page_size;
4750
void *ptr;
@@ -67,10 +70,8 @@ static SLJIT_INLINE int get_map_jit_flag()
6770
}
6871
return map_jit_flag;
6972
}
70-
#else /* !SLJIT_CONFIG_X86 */
71-
#if !(defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM)
72-
#error "Unsupported architecture"
73-
#endif /* SLJIT_CONFIG_ARM */
73+
74+
#elif defined(SLJIT_CONFIG_ARM) && SLJIT_CONFIG_ARM
7475

7576
#include <AvailabilityMacros.h>
7677
#include <pthread.h>
@@ -86,9 +87,24 @@ static SLJIT_INLINE void apple_update_wx_flags(sljit_s32 enable_exec)
8687
#endif /* BigSur */
8788
pthread_jit_write_protect_np(enable_exec);
8889
}
89-
#endif /* SLJIT_CONFIG_X86 */
90+
91+
#elif defined(SLJIT_CONFIG_PPC) && SLJIT_CONFIG_PPC
92+
93+
#define SLJIT_MAP_JIT (0)
94+
#define SLJIT_UPDATE_WX_FLAGS(from, to, enable_exec)
95+
96+
#else
97+
#error "Unsupported architecture"
98+
#endif /* SLJIT_CONFIG */
99+
90100
#else /* !TARGET_OS_OSX */
101+
102+
#ifdef MAP_JIT
91103
#define SLJIT_MAP_JIT (MAP_JIT)
104+
#else
105+
#define SLJIT_MAP_JIT (0)
106+
#endif
107+
92108
#endif /* TARGET_OS_OSX */
93109

94110
static SLJIT_INLINE void* alloc_chunk(sljit_uw size)

src/sljit/sljitConfigInternal.h

+24-4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ extern "C" {
8585
Other macros:
8686
SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT
8787
SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper)
88+
SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit
89+
floating point register when SLJIT_HAS_F64_AS_F32_PAIR returns non-zero
8890
*/
8991

9092
/***********************************************************/
@@ -201,6 +203,10 @@ extern "C" {
201203
/* Instruction cache flush. */
202204
/****************************/
203205

206+
#ifdef __APPLE__
207+
#include <AvailabilityMacros.h>
208+
#endif
209+
204210
/*
205211
* TODO:
206212
*
@@ -241,7 +247,7 @@ extern "C" {
241247
/* Not required to implement on archs with unified caches. */
242248
#define SLJIT_CACHE_FLUSH(from, to)
243249

244-
#elif defined __APPLE__
250+
#elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
245251

246252
/* Supported by all macs since Mac OS 10.5.
247253
However, it does not work on non-jailbroken iOS devices,
@@ -393,9 +399,10 @@ typedef double sljit_f64;
393399
/* Auto detecting mips revision. */
394400
#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6)
395401
#define SLJIT_MIPS_REV 6
396-
#elif (defined __mips_isa_rev && __mips_isa_rev >= 1) \
397-
|| (defined __clang__ && defined _MIPS_ARCH_OCTEON) \
398-
|| (defined __clang__ && defined _MIPS_ARCH_P5600)
402+
#elif defined(__mips_isa_rev) && __mips_isa_rev >= 1
403+
#define SLJIT_MIPS_REV __mips_isa_rev
404+
#elif defined(__clang__) \
405+
&& (defined(_MIPS_ARCH_OCTEON) || defined(_MIPS_ARCH_P5600))
399406
/* clang either forgets to define (clang-7) __mips_isa_rev at all
400407
* or sets it to zero (clang-8,-9) for -march=octeon (MIPS64 R2+)
401408
* and -march=p5600 (MIPS32 R5).
@@ -676,6 +683,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
676683
#define SLJIT_HAS_STATUS_FLAGS_STATE 1
677684
#endif
678685

686+
/***************************************/
687+
/* Floating point register management. */
688+
/***************************************/
689+
690+
#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \
691+
|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
692+
#define SLJIT_F64_SECOND(reg) \
693+
((reg) + SLJIT_FS0)
694+
#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */
695+
#define SLJIT_F64_SECOND(reg) \
696+
(reg)
697+
#endif /* SLJIT_CONFIG_ARM_32 || SLJIT_CONFIG_MIPS_32 */
698+
679699
/*************************************/
680700
/* Debug and verbose related macros. */
681701
/*************************************/

0 commit comments

Comments
 (0)