1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 21:40:33 +02:00

Allow jit_begin_data to declare max data size

* lightening.h:
* lightening/lightening.c (jit_begin_data): Add max data size
  parameter.  If nonzero, can allow the JIT to avoid prematurely
  emitting a constant pool.
  (jit_end_data): Allow pending literals.
* tests/jmp_table.c (run_test): Use new API.
This commit is contained in:
Andy Wingo 2020-07-30 13:36:24 +02:00
parent 91c1591e41
commit 44b07aef4b
3 changed files with 10 additions and 10 deletions

View file

@ -661,7 +661,7 @@ FOR_EACH_INSTRUCTION(DECLARE_INSTRUCTION)
# define jit_truncr_f(j,u,v) jit_truncr_f_l(j,u,v) # define jit_truncr_f(j,u,v) jit_truncr_f_l(j,u,v)
#endif #endif
void jit_begin_data(jit_state_t *); void jit_begin_data(jit_state_t *, size_t max_size_or_zero);
void jit_end_data(jit_state_t *); void jit_end_data(jit_state_t *);
void jit_emit_u8(jit_state_t *, uint8_t); void jit_emit_u8(jit_state_t *, uint8_t);
void jit_emit_u16(jit_state_t *, uint16_t); void jit_emit_u16(jit_state_t *, uint16_t);

View file

@ -484,12 +484,16 @@ jit_patch_there(jit_state_t* _jit, jit_reloc_t reloc, jit_pointer_t addr)
} }
void void
jit_begin_data(jit_state_t *j) jit_begin_data(jit_state_t *j, size_t max_size_or_zero)
{ {
#ifdef JIT_NEEDS_LITERAL_POOL #ifdef JIT_NEEDS_LITERAL_POOL
if (j->pool->size) if (j->pool->size) {
emit_literal_pool(j, NO_GUARD_NEEDED); uint8_t *deadline = j->start + j->pool->deadline;
ASSERT(j->overflow || j->pool->size == 0); // Emit a literal pool now if the data might overwrite the deadline.
// Emitting data won't add entries to the pool.
if (max_size_or_zero == 0 || j->pc.uc + max_size_or_zero >= deadline)
emit_literal_pool(j, NO_GUARD_NEEDED);
}
#endif #endif
ASSERT(!j->emitting_data); ASSERT(!j->emitting_data);
@ -499,10 +503,6 @@ jit_begin_data(jit_state_t *j)
void void
jit_end_data(jit_state_t *j) jit_end_data(jit_state_t *j)
{ {
#ifdef JIT_NEEDS_LITERAL_POOL
ASSERT(j->overflow || j->pool->size == 0);
#endif
ASSERT(j->emitting_data); ASSERT(j->emitting_data);
j->emitting_data = 0; j->emitting_data = 0;
} }

View file

@ -17,7 +17,7 @@ run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size)
jit_ldxr(j, JIT_R1, JIT_R1, JIT_R0); jit_ldxr(j, JIT_R1, JIT_R1, JIT_R0);
jit_jmpr(j, JIT_R1); jit_jmpr(j, JIT_R1);
jit_begin_data (j); jit_begin_data (j, (NTARGETS + 1) * sizeof(intptr_t));
jit_align(j, sizeof(intptr_t)); jit_align(j, sizeof(intptr_t));
jit_patch_here(j, table); jit_patch_here(j, table);
jit_reloc_t targets[NTARGETS]; jit_reloc_t targets[NTARGETS];