Browse Source

do not start new basic block on the bytecode mark

fix offset for the last mark
cache-refactoring
Aleksey Demakov 17 years ago
parent
commit
37c5525299
  1. 9
      ChangeLog
  2. 6
      jit/jit-cache.c
  3. 32
      jit/jit-insn.c

9
ChangeLog

@ -1,3 +1,12 @@
2007-11-17 Aleksey Demakov <ademakov@gmail.com>
* jit/jit-insn.c (jit_insn_mark_offset): do not start new block
on the bytecode mark. If a mark goes just after another mark then
replace the old mark rather than add the new.
* jit/jit-cache.c (_jit_cache_get_bytecode)
(_jit_cache_get_native): fix offset for the last bytecode mark.
2007-11-13 Aleksey Demakov <ademakov@gmail.com> 2007-11-13 Aleksey Demakov <ademakov@gmail.com>
* tools/Makefile.am (noinst_HEADERS): add gen-apply-macosx.h * tools/Makefile.am (noinst_HEADERS): add gen-apply-macosx.h

6
jit/jit-cache.c

@ -1323,7 +1323,8 @@ unsigned long _jit_cache_get_native(jit_cache_t cache, void *start,
} }
prevNativeOfs = nativeOfs; prevNativeOfs = nativeOfs;
} }
return JIT_CACHE_NO_OFFSET;
return exact ? JIT_CACHE_NO_OFFSET : prevNativeOfs;
} }
unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start, unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start,
@ -1350,7 +1351,8 @@ unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start,
} }
prevOfs = ofs; prevOfs = ofs;
} }
return JIT_CACHE_NO_OFFSET;
return exact ? JIT_CACHE_NO_OFFSET : prevOfs;
} }
unsigned long _jit_cache_get_size(jit_cache_t cache) unsigned long _jit_cache_get_size(jit_cache_t cache)

32
jit/jit-insn.c

@ -8013,15 +8013,35 @@ int jit_insn_move_blocks_to_start
@*/ @*/
int jit_insn_mark_offset(jit_function_t func, jit_int offset) int jit_insn_mark_offset(jit_function_t func, jit_int offset)
{ {
#if 1 jit_block_t block;
if(!jit_insn_new_block(func)) jit_insn_t last;
jit_value_t value;
/* Ensure that we have a builder for this function */
if(!_jit_function_ensure_builder(func))
{ {
return 0; return 0;
} }
#endif
return create_unary_note(func, JIT_OP_MARK_OFFSET, value = jit_value_create_nint_constant(func, jit_type_int, offset);
jit_value_create_nint_constant if (!value)
(func, jit_type_int, offset)); {
return 0;
}
/* If the previous instruction is mark offset too
then just replace the offset value in place --
we are not interested in bytecodes that produce
no real code. */
block = func->builder->current_block;
last = _jit_block_get_last(block);
if (last && last->opcode == JIT_OP_MARK_OFFSET)
{
last->value1 = value;
return 1;
}
return create_unary_note(func, JIT_OP_MARK_OFFSET, value);
} }
/* Documentation is in jit-debugger.c */ /* Documentation is in jit-debugger.c */

Loading…
Cancel
Save