Improve memory clearing in JIT.
This commit is contained in:
parent
325908279e
commit
106d9d3a25
|
@ -3048,13 +3048,50 @@ else
|
||||||
static SLJIT_INLINE void reset_fast_fail(compiler_common *common)
|
static SLJIT_INLINE void reset_fast_fail(compiler_common *common)
|
||||||
{
|
{
|
||||||
DEFINE_COMPILER;
|
DEFINE_COMPILER;
|
||||||
|
sljit_s32 size = common->fast_fail_end_ptr - common->fast_fail_start_ptr;
|
||||||
|
sljit_s32 src = SLJIT_IMM;
|
||||||
sljit_s32 i;
|
sljit_s32 i;
|
||||||
|
struct sljit_label *loop;
|
||||||
|
|
||||||
SLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr);
|
SLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr);
|
||||||
|
|
||||||
OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));
|
if (size == sizeof(sljit_sw))
|
||||||
for (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw))
|
{
|
||||||
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, TMP1, 0);
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->fast_fail_start_ptr, SLJIT_IMM, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sljit_get_register_index(TMP3) >= 0 && !sljit_has_cpu_feature(SLJIT_HAS_ZERO_REGISTER))
|
||||||
|
{
|
||||||
|
OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);
|
||||||
|
src = TMP3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size <= 6 * sizeof(sljit_sw))
|
||||||
|
{
|
||||||
|
for (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw))
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, src, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GET_LOCAL_BASE(TMP1, 0, common->fast_fail_start_ptr);
|
||||||
|
|
||||||
|
i = ((size / (sljit_s32)sizeof(sljit_sw)) % 3) * sizeof(sljit_sw);
|
||||||
|
|
||||||
|
OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, size - i);
|
||||||
|
|
||||||
|
loop = LABEL();
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
|
||||||
|
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -2 * (sljit_sw)sizeof(sljit_sw), src, 0);
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), -1 * (sljit_sw)sizeof(sljit_sw), src, 0);
|
||||||
|
CMPTO(SLJIT_LESS, TMP1, 0, TMP2, 0, loop);
|
||||||
|
|
||||||
|
if (i >= (sljit_sw)sizeof(sljit_sw))
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), 0, src, 0);
|
||||||
|
|
||||||
|
if (i >= 2 * (sljit_sw)sizeof(sljit_sw))
|
||||||
|
OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), sizeof(sljit_sw), src, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SLJIT_INLINE void do_reset_match(compiler_common *common, int length)
|
static SLJIT_INLINE void do_reset_match(compiler_common *common, int length)
|
||||||
|
|
|
@ -571,12 +571,14 @@ static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler
|
||||||
#define SLJIT_HAS_FPU 0
|
#define SLJIT_HAS_FPU 0
|
||||||
/* [Limitation] Some registers are virtual registers. */
|
/* [Limitation] Some registers are virtual registers. */
|
||||||
#define SLJIT_HAS_VIRTUAL_REGISTERS 1
|
#define SLJIT_HAS_VIRTUAL_REGISTERS 1
|
||||||
|
/* [Emulated] Has zero register (setting a memory location to zero is efficient). */
|
||||||
|
#define SLJIT_HAS_ZERO_REGISTER 2
|
||||||
/* [Emulated] Count leading zero is supported. */
|
/* [Emulated] Count leading zero is supported. */
|
||||||
#define SLJIT_HAS_CLZ 2
|
#define SLJIT_HAS_CLZ 3
|
||||||
/* [Emulated] Conditional move is supported. */
|
/* [Emulated] Conditional move is supported. */
|
||||||
#define SLJIT_HAS_CMOV 3
|
#define SLJIT_HAS_CMOV 4
|
||||||
/* [Emulated] Conditional move is supported. */
|
/* [Emulated] Conditional move is supported. */
|
||||||
#define SLJIT_HAS_PREFETCH 4
|
#define SLJIT_HAS_PREFETCH 5
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
|
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
|
||||||
/* [Not emulated] SSE2 support is available on x86. */
|
/* [Not emulated] SSE2 support is available on x86. */
|
||||||
|
|
|
@ -684,6 +684,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
|
||||||
#else
|
#else
|
||||||
#error "FIR check is not implemented for this architecture"
|
#error "FIR check is not implemented for this architecture"
|
||||||
#endif
|
#endif
|
||||||
|
case SLJIT_HAS_ZERO_REGISTER:
|
||||||
|
return 1;
|
||||||
|
|
||||||
#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
|
#if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
|
||||||
case SLJIT_HAS_CLZ:
|
case SLJIT_HAS_CLZ:
|
||||||
|
|
|
@ -626,6 +626,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* A saved register is set to a zero value. */
|
||||||
|
case SLJIT_HAS_ZERO_REGISTER:
|
||||||
case SLJIT_HAS_CLZ:
|
case SLJIT_HAS_CLZ:
|
||||||
case SLJIT_HAS_PREFETCH:
|
case SLJIT_HAS_PREFETCH:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -451,6 +451,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case SLJIT_HAS_ZERO_REGISTER:
|
||||||
|
return 1;
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)
|
#if (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)
|
||||||
case SLJIT_HAS_CMOV:
|
case SLJIT_HAS_CMOV:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -2316,6 +2316,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compile
|
||||||
if (!HAS_FLAGS(op)) {
|
if (!HAS_FLAGS(op)) {
|
||||||
if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
|
if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
|
||||||
return compiler->error;
|
return compiler->error;
|
||||||
|
if (SLOW_IS_REG(dst) && src2 == dst) {
|
||||||
|
FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), dst, 0, dst, 0, src1, src1w));
|
||||||
|
return emit_unary(compiler, NEG_rm, dst, 0, dst, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
|
|
Loading…
Reference in New Issue