mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-04 14:20:26 +02:00
Change type of return of jit_arg* and argument to jit_getarg*
* check/lightning.c, include/lightning.h, lib/jit_arm.c, lib/jit_mips.c, lib/jit_ppc.c, lib/jit_print.c, lib/jit_x86.c, lib/lightning.c: Change return value of jit_arg{,_f,_d} to a jit_node_t* object, that should be used as argument to jit_getarg_{c,uc,s,us,i,ui,l,f,d}. This just requires changing from jit_int32_t to jit_pointer_t (or jit_node_t*) the "handle" for the getarg calls, with the benefit that it makes it easy to implement patching of the stack address of non register arguments, this way allowing to implement variable size stack frames if applicable; useful if there are too many registers and jit functions uses only a few callee save registers.
This commit is contained in:
parent
1287a2d448
commit
2e6c680d70
9 changed files with 304 additions and 256 deletions
|
@ -229,7 +229,7 @@ _jit_epilog(jit_state_t *_jit)
|
|||
_jit->function = NULL;
|
||||
}
|
||||
|
||||
jit_int32_t
|
||||
jit_node_t *
|
||||
_jit_arg(jit_state_t *_jit)
|
||||
{
|
||||
jit_int32_t offset;
|
||||
|
@ -244,7 +244,7 @@ _jit_arg(jit_state_t *_jit)
|
|||
else
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_word_t);
|
||||
return (offset);
|
||||
return (jit_new_node_w(jit_code_arg, offset));
|
||||
}
|
||||
|
||||
jit_bool_t
|
||||
|
@ -253,7 +253,7 @@ _jit_arg_reg_p(jit_state_t *_jit, jit_int32_t offset)
|
|||
return (offset >= 0 && offset < 4);
|
||||
}
|
||||
|
||||
jit_int32_t
|
||||
jit_node_t *
|
||||
_jit_arg_f(jit_state_t *_jit)
|
||||
{
|
||||
jit_int32_t offset;
|
||||
|
@ -278,7 +278,7 @@ _jit_arg_f(jit_state_t *_jit)
|
|||
else
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_float32_t);
|
||||
return (offset);
|
||||
return (jit_new_node_w(jit_code_arg_f, offset));
|
||||
}
|
||||
|
||||
jit_bool_t
|
||||
|
@ -288,7 +288,7 @@ _jit_arg_f_reg_p(jit_state_t *_jit, jit_int32_t offset)
|
|||
return (offset >= 0 && offset < 8);
|
||||
}
|
||||
|
||||
jit_int32_t
|
||||
jit_node_t *
|
||||
_jit_arg_d(jit_state_t *_jit)
|
||||
{
|
||||
jit_int32_t offset;
|
||||
|
@ -313,7 +313,7 @@ _jit_arg_d(jit_state_t *_jit)
|
|||
else
|
||||
offset = _jit->function->self.size;
|
||||
_jit->function->self.size += sizeof(jit_float64_t);
|
||||
return (offset);
|
||||
return (jit_new_node_w(jit_code_arg_d, offset));
|
||||
}
|
||||
|
||||
jit_bool_t
|
||||
|
@ -323,95 +323,95 @@ _jit_arg_d_reg_p(jit_state_t *_jit, jit_int32_t offset)
|
|||
}
|
||||
|
||||
void
|
||||
_jit_getarg_c(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_c(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_extr_c(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_extr_c(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_c(u, _FP, v);
|
||||
jit_ldxi_c(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_uc(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_extr_uc(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_extr_uc(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_uc(u, _FP, v);
|
||||
jit_ldxi_uc(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_s(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_extr_s(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_extr_s(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_s(u, _FP, v);
|
||||
jit_ldxi_s(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_us(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_extr_us(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_extr_us(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_us(u, _FP, v);
|
||||
jit_ldxi_us(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_i(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4) {
|
||||
if (v->u.w < 4) {
|
||||
#if __WORDSIZE == 64
|
||||
jit_extr_i(u, _A0 - v);
|
||||
jit_extr_i(u, _A0 - v->u.w);
|
||||
#else
|
||||
jit_movr(u, _A0 - v);
|
||||
jit_movr(u, _A0 - v->u.w);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
jit_ldxi_i(u, _FP, v);
|
||||
jit_ldxi_i(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
#if __WORDSIZE == 64
|
||||
void
|
||||
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_ui(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_extr_ui(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_extr_ui(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_ui(u, _FP, v);
|
||||
jit_ldxi_ui(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_movr(u, _A0 - v);
|
||||
if (v->u.w < 4)
|
||||
jit_movr(u, _A0 - v->u.w);
|
||||
else
|
||||
jit_ldxi_l(u, _FP, v);
|
||||
jit_ldxi_l(u, _FP, v->u.w);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_new_node_ww(jit_code_getarg_f, u, _A0 - v);
|
||||
else if (v < 8)
|
||||
jit_movr_f(u, _F12 - ((v - 4) >> 1));
|
||||
if (v->u.w < 4)
|
||||
jit_new_node_ww(jit_code_getarg_f, u, _A0 - v->u.w);
|
||||
else if (v->u.w < 8)
|
||||
jit_movr_f(u, _F12 - ((v->u.w - 4) >> 1));
|
||||
else
|
||||
jit_ldxi_f(u, _FP, v);
|
||||
jit_ldxi_f(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
_jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
_jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_new_node_ww(jit_code_getarg_d, u, _A0 - v);
|
||||
else if (v < 8)
|
||||
jit_movr_d(u, _F12 - ((v - 4) >> 1));
|
||||
if (v->u.w < 4)
|
||||
jit_new_node_ww(jit_code_getarg_d, u, _A0 - v->u.w);
|
||||
else if (v->u.w < 8)
|
||||
jit_movr_d(u, _F12 - ((v->u.w - 4) >> 1));
|
||||
else
|
||||
jit_ldxi_d(u, _FP, v);
|
||||
jit_ldxi_d(u, _FP, v->u.w);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1232,6 +1232,9 @@ _jit_emit(jit_state_t *_jit)
|
|||
assert(node->flag & jit_flag_data);
|
||||
pushargi_d(rn(node->u.w), (jit_float64_t *)node->v.n->u.w);
|
||||
break;
|
||||
case jit_code_arg:
|
||||
case jit_code_arg_f: case jit_code_arg_d:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue