1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-05 03:30:24 +02:00

Implement fpr register arguments and minor extra fixes.

* include/lightning.h: Add new backend specific movr_w_d,
	movr_d_w and movi_d_w codes as helpers to ia64 varargs
	functions arguments.

	* lib/jit_ia64-cpu.c:
	  Correct wrong encoding of A5 small integers.
	  Correct define of "mux" instruction modifiers.
	  Correct ordering of arguments and predicates of cmp_xy
	implementation with immediate arguments; like most other
	codes with an immediate, the immediate is the second, not
	the third argument.

	* lib/jit_ia64-fpu.c: Actual implementation of the code
	to move to/from gpr to/from fpr, to implement varargs abi.

	* lib/jit_ia64.c: Make fpr argument registers not allocatable
	as temporaries, no need for the extra checks when there are
	plenty registers.

	* lib/jit_print.c, lib/lightning.c: Minor updates for the
	new movr_w_d, movr_d_w and movi_d_w codes.
This commit is contained in:
pcpa 2013-04-27 01:41:46 -03:00
parent b663d29bea
commit caeb6d6e11
7 changed files with 179 additions and 41 deletions

View file

@ -1,3 +1,27 @@
2013-04-27 Paulo Andrade <pcpa@gnu.org>
* include/lightning.h: Add new backend specific movr_w_d,
movr_d_w and movi_d_w codes as helpers to ia64 varargs
functions arguments.
* lib/jit_ia64-cpu.c:
Correct wrong encoding of A5 small integers.
Correct define of "mux" instruction modifiers.
Correct ordering of arguments and predicates of cmp_xy
implementation with immediate arguments; like most other
codes with an immediate, the immediate is the second, not
the third argument.
* lib/jit_ia64-fpu.c: Actual implementation of the code
to move to/from gpr to/from fpr, to implement varargs abi.
* lib/jit_ia64.c: Make fpr argument registers not allocatable
as temporaries, no need for the extra checks when there are
plenty registers.
* lib/jit_print.c, lib/lightning.c: Minor updates for the
new movr_w_d, movr_d_w and movi_d_w codes.
2013-04-26 Paulo Andrade <pcpa@gnu.org>
* lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c: Correct code to

View file

@ -739,6 +739,8 @@ typedef enum {
jit_code_movr_w_f, jit_code_movr_ww_d, /* w* -> f|d */
#define jit_movr_w_f(u, v) jit_new_node_ww(jit_code_movr_w_f, u, v)
#define jit_movr_ww_d(u, v, w) jit_new_node_www(jit_code_movr_ww_d, u, v, w)
jit_code_movr_w_d, /* w -> d */
#define jit_movr_w_d(u, v) jit_new_node_ww(jit_code_movr_w_d, u, v)
jit_code_movr_f_w, jit_code_movi_f_w, /* f|d -> w* */
#define jit_movr_f_w(u, v) jit_new_node_ww(jit_code_movr_f_w, u, v)
@ -746,6 +748,11 @@ typedef enum {
jit_code_movr_d_ww, jit_code_movi_d_ww,
#define jit_movr_d_ww(u, v, w) jit_new_node_www(jit_code_movr_d_ww, u, v, w)
#define jit_movi_d_ww(u, v, w) jit_new_node_wwd(jit_code_movi_d_ww, u, v, w)
jit_code_movr_d_w, jit_code_movi_d_w, /* d -> w */
#define jit_movr_d_w(u, v) jit_new_node_ww(jit_code_movr_d_w, u, v)
#define jit_movi_d_w(u, v) jit_new_node_wd(jit_code_movi_d_w, u, v)
jit_code_x86_retval_f, jit_code_x86_retval_d,
} jit_code_t;

View file

@ -202,11 +202,10 @@ typedef enum {
#define BR_INDWH_DPTK 2
#define MUX_BRCST 0
/* FIXME only @name values in manual and only @brcst disassembled by binutils */
#define MUX_REV 1 /* not disassembled as @rev */
#define MUX_MIX 2 /* not disassembled as @mix */
#define MUX_SHUF 3 /* not disassembled as @shuf */
#define MUX_ALT 4 /* not disassembled as @alt */
#define MUX_REV 11
#define MUX_MIX 8
#define MUX_SHUF 9
#define MUX_ALT 10
#define ldr(r0,r1) ldr_l(r0,r1)
#define ldi(r0,i0) ldi_l(r0,i0)
@ -855,8 +854,8 @@ static void _X5(jit_state_t*,jit_word_t,
#define MOV(r0,r1) ADDS(r0,0,r1)
#define MOV_p(r0,r1,_p) ADDS_p(r0,0,r1,_p)
/* mov - Move Immediate */
#define MOVI(r1,im) ADDL(r1,im,0)
#define MOVI_p(r1,im,_p) ADDL_p(r1,im,0,_p)
#define MOVI(r1,im) ADDL(r1,im,GR_0)
#define MOVI_p(r1,im,_p) ADDL_p(r1,im,GR_0,_p)
/* mov - Move Indirect Register */
#define MOV_rn_RR(r1,r3) M43(0x10,r3,r1)
#define MOV_rn_DBR(r1,r3) M43(0x11,r3,r1)
@ -2075,15 +2074,21 @@ static void
_A5(jit_state_t *_jit, jit_word_t _p,
jit_word_t r3, jit_word_t im, jit_word_t r1)
{
jit_word_t s, i5, i9, i7;
assert(!(_p & ~0x3fL));
assert(!(r3 & ~0x3L));
assert(im >= -2097152 && im < 2097151);
assert(!(r1 & ~0x7fL));
/* imm22 = sign_ext(s << 21 | imm5c << 16 | imm9d << 7 | imm7b, 22) */
s = (im & 0x200000) >> 21;
i5 = (im & 0x1f0000) >> 16;
i9 = (im & 0xff80) >> 7;
i7 = im & 0x7f;
TSTREG1(r3);
TSTPRED(_p);
TSTREG1(r1);
inst((9L<<37)|(((im>>7)&0x7fffL)<<22)|(r3<<20)|
((im&0x7fL)<<13)|(r1<<6)|_p, INST_A);
inst((9L<<37)|(s<<36)|(i9<<27)|(i5<<22)|
(r3<<20)|(i7<<13)|(r1<<6)|_p, INST_A);
SETREG(r1);
}
@ -3685,7 +3690,7 @@ _iqmulr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
}
else
mulr(r0, r2, r3);
mulh(sign, r1, r2, r3);
mulh(r1, r2, r3, sign);
if (r0 == r2 || r0 == r3) {
movr(r0, rn(reg));
jit_unget_reg(reg);
@ -3837,7 +3842,7 @@ _lti(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (i0 >= -128 && i0 <= 127)
CMPI_LT(PR_6, PR_7, i0, r1);
CMPI_LT(PR_7, PR_6, i0 - 1, r1);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
@ -3861,7 +3866,7 @@ _lti_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (i0 >= -128 && i0 <= 127)
CMPI_LTU(PR_6, PR_7, i0, r1);
CMPI_LTU(PR_7, PR_6, i0 - 1, r1);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
@ -3945,7 +3950,7 @@ _gei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (i0 >= -128 && i0 <= 127)
CMPI_LT(PR_6, PR_7, i0, r1);
CMPI_LT(PR_7, PR_6, i0 - 1, r1);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
@ -3969,7 +3974,7 @@ _gei_u(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
jit_int32_t reg;
if (i0 >= -128 && i0 <= 127)
CMPI_LTU(PR_6, PR_7, i0, r1);
CMPI_LTU(PR_7, PR_6, i0, r1);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i0);
@ -4387,7 +4392,7 @@ _blti(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
jit_word_t w;
jit_int32_t reg;
if (i1 >= -128 && i1 <= 127)
CMPI_LT(PR_6, PR_7, i1, r0);
CMPI_LT(PR_7, PR_6, i1 - 1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i1);
@ -4417,7 +4422,7 @@ _blti_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
jit_word_t w;
jit_int32_t reg;
if (i1 >= -128 && i1 <= 127)
CMPI_LTU(PR_6, PR_7, i1, r0);
CMPI_LTU(PR_7, PR_6, i1 - 1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i1);
@ -4523,7 +4528,7 @@ _bgei(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
jit_word_t w;
jit_int32_t reg;
if (i1 >= -128 && i1 <= 127)
CMPI_LT(PR_6, PR_7, i1, r0);
CMPI_LT(PR_7, PR_6, i1 - 1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i1);
@ -4553,7 +4558,7 @@ _bgei_u(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
jit_word_t w;
jit_int32_t reg;
if (i1 >= -128 && i1 <= 127)
CMPI_LTU(PR_6, PR_7, i1, r0);
CMPI_LTU(PR_7, PR_6, i1 - 1, r0);
else {
reg = jit_get_reg(jit_class_gpr);
movi(rn(reg), i1);

View file

@ -423,6 +423,15 @@ static void F16_(jit_state_t*,jit_word_t,
#define movi_f(r0,i0) ldi_f(r0,(jit_word_t)i0)
#define movi_d(r0,i0) ldi_d(r0,(jit_word_t)i0)
#define movr_f_w(r0,r1) _movr_f_w(_jit,r0,r1)
static void _movr_f_w(jit_state_t*,jit_int32_t,jit_int32_t);
#define movr_d_w(r0,r1) _movr_d_w(_jit,r0,r1)
static void _movr_d_w(jit_state_t*,jit_int32_t,jit_int32_t);
#define movi_f_w(r0,i0) _movi_f_w(_jit,r0,i0)
static void _movi_f_w(jit_state_t*,jit_int32_t,jit_word_t);
#define movi_d_w(r0,i0) _movi_d_w(_jit,r0,i0)
static void _movi_d_w(jit_state_t*,jit_int32_t,jit_word_t);
#define absr_f(r0,r1) absr_d(r0,r1)
#define absr_d(r0,r1) FABS(r0,r1)
#define negr_f(r0,r1) negr_d(r0,r1)
@ -978,6 +987,42 @@ F16_(jit_state_t* _jit, jit_word_t _p,
inst((((im>>20)&1L)<<36)|(y<<27)|(1L<<26)|((im&0xffffL)<<6)|_p, INST_F);
}
static void
_movr_f_w(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
/* Should actually be used only in this case (with out0 == 120) */
if (r0 >= 120)
r0 = _jitc->rout + (r0 - 120);
GETF_S(r0, r1);
}
static void
_movi_f_w(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
/* Should actually be used only in this case (with out0 == 120) */
if (r0 >= 120)
r0 = _jitc->rout + (r0 - 120);
ldi_i(r0, i0);
}
static void
_movr_d_w(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
/* Should actually be used only in this case (with out0 == 120) */
if (r0 >= 120)
r0 = _jitc->rout + (r0 - 120);
GETF_D(r0, r1);
}
static void
_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
/* Should actually be used only in this case (with out0 == 120) */
if (r0 >= 120)
r0 = _jitc->rout + (r0 - 120);
ldi_l(r0, i0);
}
#define fpr_opi(name, type, size) \
static void \
_##name##i_##type(jit_state_t *_jit, \
@ -1333,7 +1378,7 @@ _stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
static void
_sqrtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
//MOV(_jitc->rout, r1);
movr_f(GR_8, r1);
calli((jit_word_t)sqrtf);
MOVF(r0, GR_8);
}
@ -1341,7 +1386,7 @@ _sqrtr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
static void
_sqrtr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
//MOV(_jitc->rout, r1);
movr_d(GR_8, r1);
calli((jit_word_t)sqrt);
MOVF(r0, GR_8);
}

View file

@ -133,12 +133,12 @@ jit_register_t _rvs[] = {
/* Scratch */
{ rc(fpr)|6, "f6" }, { rc(fpr)|7, "f7" },
/* Do not allocate for the sake of simplification */
{ 8, "f8" },
{ rc(arg)|8, "f8" },
/* Scratch - Argument/return registers */
{ rc(fpr)|9, "f9" },
{ rc(fpr)|10, "f10" }, { rc(fpr)|11, "f11" },
{ rc(fpr)|12, "f12" }, { rc(fpr)|13, "f13" },
{ rc(fpr)|14, "f14" }, { rc(fpr)|15, "f15" },
{ rc(arg)|9, "f9" },
{ rc(arg)|10, "f10" }, { rc(arg)|11, "f11" },
{ rc(arg)|12, "f12" }, { rc(arg)|13, "f13" },
{ rc(arg)|14, "f14" }, { rc(arg)|15, "f15" },
/* Do not touch callee save registers not automatically spill/reloaded */
{ rc(sav)|16, "f16" }, { rc(sav)|17, "f17" },
{ rc(sav)|18, "f18" }, { rc(sav)|19, "f19" },
@ -456,23 +456,19 @@ _jit_getarg_l(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
void
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
/*
if (v->u.w < 8)
jit_movr_f(u, _R32 + v->u.w);
jit_movr_f(u, _F8 + v->u.w);
else
jit_ldxi_f(u, JIT_FP, v->u.w);
*/
}
void
_jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_node_t *v)
{
/*
if (v->u.w < 8)
jit_movr_d(u, _R32 + v->u.w);
jit_movr_d(u, _F8 + v->u.w);
else
jit_ldxi_d(u, JIT_FP, v->u.w);
*/
}
void
@ -511,6 +507,17 @@ void
_jit_pushargr_f(jit_state_t *_jit, jit_int32_t u)
{
assert(_jitc->function);
if (_jitc->function->call.argi < 8) {
if (!(_jitc->function->call.call & jit_call_varargs))
jit_movr_f(_F8 + _jitc->function->call.argi, u);
else
jit_movr_f_w(_OUT0 + _jitc->function->call.argi, u);
++_jitc->function->call.argi;
}
else {
jit_stxr_f(_jitc->function->call.size, JIT_SP, u);
_jitc->function->call.size += sizeof(jit_word_t);
}
}
void
@ -518,16 +525,37 @@ _jit_pushargi_f(jit_state_t *_jit, jit_float32_t u)
{
jit_int32_t regno;
assert(_jitc->function);
/* FIXME move to OUTn or stack */
regno = jit_get_reg(jit_class_fpr);
jit_movi_f(regno, u);
jit_unget_reg(regno);
if (_jitc->function->call.argi < 8) {
if (!(_jitc->function->call.call & jit_call_varargs))
jit_movi_f(_F8 + _jitc->function->call.argi, u);
else
jit_movi_f_w(_OUT0 + _jitc->function->call.argi, u);
++_jitc->function->call.argi;
}
else {
regno = jit_get_reg(jit_class_fpr);
jit_movi_f(regno, u);
jit_stxi_f(_jitc->function->call.size, JIT_SP, regno);
_jitc->function->call.size += sizeof(jit_word_t);
jit_unget_reg(regno);
}
}
void
_jit_pushargr_d(jit_state_t *_jit, jit_int32_t u)
{
assert(_jitc->function);
if (_jitc->function->call.argi < 8) {
if (!(_jitc->function->call.call & jit_call_varargs))
jit_movr_d(_F8 + _jitc->function->call.argi, u);
else
jit_movr_d_w(_OUT0 + _jitc->function->call.argi, u);
++_jitc->function->call.argi;
}
else {
jit_stxr_d(_jitc->function->call.size, JIT_SP, u);
_jitc->function->call.size += sizeof(jit_word_t);
}
}
void
@ -535,10 +563,20 @@ _jit_pushargi_d(jit_state_t *_jit, jit_float64_t u)
{
jit_int32_t regno;
assert(_jitc->function);
/* FIXME move to OUTn or stack */
regno = jit_get_reg(jit_class_fpr);
jit_movi_d(regno, u);
jit_unget_reg(regno);
if (_jitc->function->call.argi < 8) {
if (!(_jitc->function->call.call & jit_call_varargs))
jit_movi_d(_F8 + _jitc->function->call.argi, u);
else
jit_movi_d_w(_OUT0 + _jitc->function->call.argi, u);
++_jitc->function->call.argi;
}
else {
regno = jit_get_reg(jit_class_fpr);
jit_movi_d(regno, u);
jit_stxi_d(_jitc->function->call.size, JIT_SP, regno);
_jitc->function->call.size += sizeof(jit_word_t);
jit_unget_reg(regno);
}
}
jit_bool_t
@ -633,6 +671,7 @@ _jit_retval_d(jit_state_t *_jit, jit_int32_t r0)
jit_pointer_t
_emit_code(jit_state_t *_jit)
{
jit_uint8_t *end;
jit_node_t *node;
jit_node_t *temp;
jit_word_t word;
@ -745,8 +784,11 @@ _emit_code(jit_state_t *_jit)
patch(word, node); \
} \
break
/* default of 64 bytes is too low for some possible
* quite long code generation sequences, e.g. qdivi */
end = _jit->code.ptr + _jit->code.length - 4096;
for (node = _jitc->head; node; node = node->next) {
if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
if (_jit->pc.uc >= end && !jit_remap())
return (NULL);
value = jit_classify(node->code);
@ -1195,6 +1237,18 @@ _emit_code(jit_state_t *_jit)
case jit_code_arg:
case jit_code_arg_f: case jit_code_arg_d:
break;
case jit_code_movr_f_w:
movr_f_w(rn(node->u.w), rn(node->v.w));
break;
case jit_code_movr_d_w:
movr_d_w(rn(node->u.w), rn(node->v.w));
break;
case jit_code_movi_f_w:
movi_f_w(rn(node->u.w), node->v.n->u.w);
break;
case jit_code_movi_d_w:
movi_d_w(rn(node->u.w), node->v.n->u.w);
break;
default:
abort();
}

View file

@ -209,8 +209,10 @@ static char *code_name[] = {
"bordr_d", "bordi_d",
"bunordr_d", "bunordi_d",
"movr_w_f", "movr_ww_d",
"movr_w_d",
"movr_f_w", "movi_f_w",
"movr_d_ww", "movi_d_ww",
"movr_d_w", "movi_d_w",
"x86_retval_f", "x86_retval_d",
};

View file

@ -1153,7 +1153,7 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
case jit_code_movi_f: case jit_code_movi_f_w:
mask = jit_cc_a0_reg|jit_cc_a0_chg|jit_cc_a1_flt;
break;
case jit_code_movi_d:
case jit_code_movi_d: case jit_code_movi_d_w:
mask = jit_cc_a0_reg|jit_cc_a0_chg|jit_cc_a1_dbl;
break;
case jit_code_movi_d_ww:
@ -1174,6 +1174,7 @@ _jit_classify(jit_state_t *_jit, jit_code_t code)
case jit_code_movr_d: case jit_code_extr_d: case jit_code_extr_f_d:
case jit_code_ldr_d:
case jit_code_movr_w_f: case jit_code_movr_f_w:
case jit_code_movr_w_d: case jit_code_movr_d_w:
mask = jit_cc_a0_reg|jit_cc_a0_chg|jit_cc_a1_reg;
break;
case jit_code_movr_d_ww: