1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-27 13:30:31 +02:00

Implement new synthesized IR codes sequences

* lib/jit_rewind.c: New file implementing generic functions
	to "rewind", or rewrite IR code sequences.

	* include/lightning.h: Add several new codes, that previously
	were a function call, that would synthesize the operation.
	Now, there is a code for the operation, and a new flag to
	know an operation is synthesized.

	* include/lightning/jit_private.h: Add several new macros to
	help construct synthesized IR code sequences.

	* lib/Makefile.am: Update for lib/jit_rewind.c.

	* lib/jit_disasm.c: Update for a small rework on jit_node_t,
	so that --enable-devel-disassembler does not need a change
	in the layout of jit_node_t.

	* lib/jit_names.c: Update for the new codes.

	* lib/jit_print.c: Update to print more readable output, and
	flag synthesized IR code sequences.

	* lib/jit_aarch64-sz.c, lib/jit_aarch64.c,
	lib/jit_arm-sz.c, lib/jit_arm.c, lib/jit_x86-sz.c,
	lib/jit_x86.c: Update for new synthesized IR code sequences.

	* lib/jit_ppc-cpu.c, lib/jit_ppc-fpu., lib/jit_ppc-sz.c,
	lib/jit_ppc.c, lib/jit_mips-cpu.c, lib/jit_mips-fpu.c,
	lib/jit_mips-sz.c, lib/jit_mips.c, lib/jit_s390-fpu.c,
	lib/jit_s390-sz.c, lib/jit_s390.c: Update for new synthesized
	IR code sequences and correct bugs in the initial varargs
	implementation support.

	* lib/jit_alpha-sz.c, lib/jit_alpha.c, lib/jit_hppa-sz.c,
	lib/jit_hppa.c, lib/jit_ia64-sz.c, lib/jit_ia64.c,
	lib/jit_sparc-sz.c, lib/jit_sparc.c: Add generic, untested
	support for the new synthesized	IR code sequences. Known
	most likely broken right now, and should be corrected once
	access to these hosts is available.

	* lib/lightning.c: Update for new IR codes, and add support
	for not yet existing instructions that change third argument.

	* size.c: Change to use different tables for LE and BE PowerPC.
	Correct a wrong endif for x32.
This commit is contained in:
pcpa 2015-06-04 18:53:07 -03:00
parent 7f1e0dfb34
commit d0a5bd8d3d
35 changed files with 4397 additions and 1152 deletions

View file

@ -58,6 +58,9 @@ static inline jit_node_t *_link_node(jit_state_t*, jit_node_t*);
#define del_node(u, v) _del_node(_jit, u, v)
static inline void _del_node(jit_state_t*, jit_node_t*, jit_node_t*);
#define free_node(u) _free_node(_jit, u)
static inline void _free_node(jit_state_t*, jit_node_t*);
#define del_label(u, v) _del_label(_jit, u, v)
static void _del_label(jit_state_t*, jit_node_t*, jit_node_t*);
@ -681,6 +684,8 @@ _new_node(jit_state_t *_jit, jit_code_t code)
new_pool();
node = _jitc->list;
_jitc->list = node->next;
if (_jitc->synth)
node->flag |= jit_flag_synth;
node->next = NULL;
node->code = code;
@ -711,6 +716,14 @@ _del_node(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node)
_jitc->list = node;
}
static inline void
_free_node(jit_state_t *_jit, jit_node_t *node)
{
memset(node, 0, sizeof(jit_node_t));
node->next = _jitc->list;
_jitc->list = node;
}
static void
_del_label(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node)
{
@ -906,6 +919,13 @@ _jit_destroy_state(jit_state_t *_jit)
jit_free((jit_pointer_t *)&_jit);
}
void
_jit_synth_inc(jit_state_t *_jit)
{
assert(_jitc->synth < 8);
++_jitc->synth;
}
jit_node_t *
_jit_new_node(jit_state_t *_jit, jit_code_t code)
{
@ -927,6 +947,13 @@ _jit_link_node(jit_state_t *_jit, jit_node_t *node)
link_node(node);
}
void
_jit_synth_dec(jit_state_t *_jit)
{
assert(_jitc->synth > 0);
--_jitc->synth;
}
jit_node_t *
_jit_new_node_w(jit_state_t *_jit, jit_code_t code,
jit_word_t u)
@ -937,6 +964,26 @@ _jit_new_node_w(jit_state_t *_jit, jit_code_t code,
return (link_node(node));
}
jit_node_t *
_jit_new_node_f(jit_state_t *_jit, jit_code_t code,
jit_float32_t u)
{
jit_node_t *node = new_node(code);
assert(!_jitc->realize);
node->u.f = u;
return (link_node(node));
}
jit_node_t *
_jit_new_node_d(jit_state_t *_jit, jit_code_t code,
jit_float64_t u)
{
jit_node_t *node = new_node(code);
assert(!_jitc->realize);
node->u.d = u;
return (link_node(node));
}
jit_node_t *
_jit_new_node_p(jit_state_t *_jit, jit_code_t code,
jit_pointer_t u)
@ -965,6 +1012,28 @@ _jit_new_node_wp(jit_state_t *_jit, jit_code_t code,
return (jit_new_node_ww(code, u, (jit_word_t)v));
}
jit_node_t *
_jit_new_node_fp(jit_state_t *_jit, jit_code_t code,
jit_float32_t u, jit_pointer_t v)
{
jit_node_t *node = new_node(code);
assert(!_jitc->realize);
node->u.f = u;
node->v.w = (jit_word_t)v;
return (link_node(node));
}
jit_node_t *
_jit_new_node_dp(jit_state_t *_jit, jit_code_t code,
jit_float64_t u, jit_pointer_t v)
{
jit_node_t *node = new_node(code);
assert(!_jitc->realize);
node->u.d = u;
node->v.w = (jit_word_t)v;
return (link_node(node));
}
jit_node_t *
_jit_new_node_pw(jit_state_t *_jit, jit_code_t code,
jit_pointer_t u, jit_word_t v)
@ -1163,7 +1232,7 @@ _jit_prepare(jit_state_t *_jit)
_jitc->function->call.argi =
_jitc->function->call.argf =
_jitc->function->call.size = 0;
_jitc->prepare = 1;
_jitc->prepare = jit_new_node(jit_code_prepare);
}
void
@ -1182,28 +1251,69 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
jit_int32_t mask;
switch (code) {
case jit_code_data: case jit_code_align: case jit_code_save:
case jit_code_load: case jit_code_name: case jit_code_label:
case jit_code_note: case jit_code_prolog: case jit_code_epilog:
case jit_code_data: case jit_code_save: case jit_code_load:
case jit_code_name: case jit_code_label: case jit_code_note:
case jit_code_prolog: case jit_code_ellipsis: case jit_code_epilog:
case jit_code_ret: case jit_code_prepare:
mask = 0;
break;
case jit_code_live: case jit_code_va_end:
case jit_code_retr: case jit_code_retr_f: case jit_code_retr_d:
case jit_code_pushargr: case jit_code_pushargr_f:
case jit_code_pushargr_d:
case jit_code_finishr: /* synthesized will set jit_cc_a0_jmp */
mask = jit_cc_a0_reg;
break;
case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d:
case jit_code_align: case jit_code_reti: case jit_code_pushargi:
case jit_code_finishi: /* synthesized will set jit_cc_a0_jmp */
mask = jit_cc_a0_int;
break;
case jit_code_reti_f: case jit_code_pushargi_f:
mask = jit_cc_a0_flt;
break;
case jit_code_reti_d: case jit_code_pushargi_d:
mask = jit_cc_a0_dbl;
break;
case jit_code_allocai:
mask = jit_cc_a0_int|jit_cc_a1_int;
break;
case jit_code_arg: case jit_code_arg_f: case jit_code_arg_d:
mask = jit_cc_a0_int|jit_cc_a0_arg;
break;
case jit_code_calli: case jit_code_jmpi:
mask = jit_cc_a0_jmp;
break;
case jit_code_callr: case jit_code_jmpr:
mask = jit_cc_a0_reg|jit_cc_a0_jmp;
break;
case jit_code_x86_retval_f:
case jit_code_x86_retval_d:
case jit_code_retval_c: case jit_code_retval_uc:
case jit_code_retval_s: case jit_code_retval_us:
case jit_code_retval_i: case jit_code_retval_ui:
case jit_code_retval_l:
case jit_code_retval_f: case jit_code_retval_d:
case jit_code_va_start:
mask = jit_cc_a0_reg|jit_cc_a0_chg;
break;
case jit_code_getarg_c: case jit_code_getarg_uc:
case jit_code_getarg_s: case jit_code_getarg_us:
case jit_code_getarg_i: case jit_code_getarg_ui:
case jit_code_getarg_l:
case jit_code_getarg_f: case jit_code_getarg_d:
mask = jit_cc_a0_reg|jit_cc_a0_chg|jit_cc_a1_arg;
break;
case jit_code_putargr: case jit_code_putargr_f:
case jit_code_putargr_d:
mask = jit_cc_a0_reg|jit_cc_a1_arg;
break;
case jit_code_putargi:
mask = jit_cc_a0_int|jit_cc_a1_arg;
break;
case jit_code_putargi_f:
mask = jit_cc_a0_flt|jit_cc_a1_arg;
break;
case jit_code_putargi_d:
mask = jit_cc_a0_dbl|jit_cc_a1_arg;
break;
case jit_code_movi: case jit_code_ldi_c: case jit_code_ldi_uc:
case jit_code_ldi_s: case jit_code_ldi_us: case jit_code_ldi_i:
case jit_code_ldi_ui: case jit_code_ldi_l: case jit_code_ldi_f:
@ -1337,6 +1447,8 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
case jit_code_bordi_d: case jit_code_bunordi_d:
mask = jit_cc_a0_jmp|jit_cc_a1_reg|jit_cc_a2_dbl;
break;
case jit_code_allocar: /* synthesized instructions make it
* equivalent to jit_cc_a0_chg */
case jit_code_str_c: case jit_code_str_s: case jit_code_str_i:
case jit_code_str_l: case jit_code_str_f: case jit_code_str_d:
mask = jit_cc_a0_reg|jit_cc_a1_reg;
@ -1512,7 +1624,15 @@ _jit_optimize(jit_state_t *_jit)
break;
default:
#if JIT_HASH_CONSTS
if (mask & jit_cc_a1_flt) {
if (mask & jit_cc_a0_flt) {
node->u.p = jit_data(&node->u.f, sizeof(jit_float32_t), 4);
node->flag |= jit_flag_node | jit_flag_data;
}
else if (mask & jit_cc_a0_dbl) {
node->u.p = jit_data(&node->u.d, sizeof(jit_float64_t), 8);
node->flag |= jit_flag_node | jit_flag_data;
}
else if (mask & jit_cc_a1_flt) {
node->v.p = jit_data(&node->v.f, sizeof(jit_float32_t), 4);
node->flag |= jit_flag_node | jit_flag_data;
}
@ -1546,6 +1666,10 @@ _jit_optimize(jit_state_t *_jit)
(jit_cc_a1_reg|jit_cc_a1_chg))
jit_regset_setbit(&_jitc->function->regset,
jit_regno(node->v.w));
if ((mask & (jit_cc_a2_reg|jit_cc_a2_chg)) ==
(jit_cc_a2_reg|jit_cc_a2_chg))
jit_regset_setbit(&_jitc->function->regset,
jit_regno(node->w.w));
}
break;
}
@ -1632,8 +1756,14 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node)
else
jit_regset_setbit(&_jitc->reglive, node->v.w);
}
if ((value & jit_cc_a2_reg) && !(node->w.w & jit_regno_patch))
jit_regset_setbit(&_jitc->reglive, node->w.w);
if ((value & jit_cc_a2_reg) && !(node->w.w & jit_regno_patch)) {
if (value & jit_cc_a2_chg) {
jit_regset_clrbit(&_jitc->reglive, node->w.w);
jit_regset_setbit(&_jitc->regmask, node->w.w);
}
else
jit_regset_setbit(&_jitc->reglive, node->w.w);
}
if (jit_regset_set_p(&_jitc->regmask)) {
bmp_zero();
jit_update(node->next, &_jitc->reglive, &_jitc->regmask);
@ -2039,8 +2169,11 @@ _jit_setup(jit_state_t *_jit, jit_block_t *block)
if ((value & jit_cc_a2_reg) &&
!(node->w.w & jit_regno_patch) &&
jit_regset_tstbit(&regmask, node->w.w)) {
jit_regset_clrbit(&regmask, node->w.w);
jit_regset_setbit(&reglive, node->w.w);
live = !(value & jit_cc_a2_chg);
if (live || !jump)
jit_regset_clrbit(&regmask, node->w.w);
if (live)
jit_regset_setbit(&reglive, node->w.w);
}
if (value & jit_cc_a0_jmp)
jump = 1;
@ -2151,7 +2284,8 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
if (!(node->w.w & jit_regno_patch)) {
if (jit_regset_tstbit(mask, node->w.w)) {
jit_regset_clrbit(mask, node->w.w);
jit_regset_setbit(live, node->w.w);
if (!(value & jit_cc_a2_chg))
jit_regset_setbit(live, node->w.w);
}
}
}
@ -2654,6 +2788,11 @@ _redundant_store(jit_state_t *_jit, jit_node_t *node, jit_bool_t jump)
if (regno == jit_regno(iter->v.w))
return;
}
if ((spec & (jit_cc_a2_reg|jit_cc_a2_chg)) ==
(jit_cc_a2_reg|jit_cc_a2_chg)) {
if (regno == jit_regno(iter->w.w))
return;
}
break;
}
}
@ -2959,6 +3098,11 @@ _simplify(jit_state_t *_jit)
_jitc->values[regno].kind = 0;
++_jitc->gen[regno];
}
if (info & jit_cc_a2_chg) {
regno = jit_regno(node->w.w);
_jitc->values[regno].kind = 0;
++_jitc->gen[regno];
}
break;
}
}
@ -2994,6 +3138,9 @@ _register_change_p(jit_state_t *_jit, jit_node_t *node, jit_node_t *link,
else if ((value & jit_cc_a1_reg) && node->v.w == regno &&
(value & jit_cc_a1_chg))
return (jit_reg_change);
else if ((value & jit_cc_a2_reg) && node->w.w == regno &&
(value & jit_cc_a2_chg))
return (jit_reg_change);
}
}