1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-15 10:10:21 +02:00

mips: Pass tests for variadic jit functions on new abi

* lib/jit_mips-cpu.c: Correct definition of htonr_ul.
	Correct prolog/epilog/va* routines to work on o64 abi.

	* lib/jit_mips-fpu.c: Correct load of double literal
	argument when not using a data buffer.
	Remove alignment correction in vaarg_d if using the
	new mips abi.

	* lib/jit_mips.c: Correct code to allow creating variadic
	jit functions when using the new mips abi.

	* lib/jit_rewind.c: Minor adjust for rewind when using
	the new mips abi, if there are varargs arguments in
	registers.
This commit is contained in:
pcpa 2015-07-03 20:53:34 -03:00
parent c6b8fb2a74
commit 17e78965a2
5 changed files with 118 additions and 19 deletions

View file

@ -217,9 +217,7 @@ static void _divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
# define negr_d(r0,r1) NEG_D(r0,r1)
# define sqrtr_f(r0,r1) SQRT_S(r0,r1)
# define sqrtr_d(r0,r1) SQRT_D(r0,r1)
# if !NEW_ABI
# define movr_w_f(r0, r1) MTC1(r1, r0)
# endif
# define movr_w_f(r0, r1) MTC1(r1, r0)
# define movr_f_w(r0, r1) MFC1(r1, r0)
# define movi_f_w(r0, i0) _movi_f_w(_jit, r0, i0)
static void _movi_f_w(jit_state_t*,jit_int32_t,jit_float32_t*);
@ -251,6 +249,7 @@ static void _movr_f(jit_state_t*,jit_int32_t,jit_int32_t);
# define movi_f(r0, i0) _movi_f(_jit, r0, i0)
static void _movi_f(jit_state_t*,jit_int32_t,jit_float32_t*);
# if NEW_ABI
# define movr_w_d(r0, r1) DMTC1(r1, r0)
# define movr_d_w(r0, r1) DMFC1(r0, r1)
# define movi_d_w(r0, i0) _movi_d_w(_jit,r0,i0)
static void _movi_d_w(jit_state_t*,jit_int32_t,jit_float64_t*);
@ -764,12 +763,22 @@ static void
_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t *i0)
{
jit_word_t w;
w = (jit_word_t)i0;
if (can_sign_extend_short_p(w))
LD(r0, w, _ZERO_REGNO);
union {
jit_word_t w;
jit_float64_t d;
} data;
if (_jitc->no_data) {
data.d = *i0;
movi(r0, data.w);
}
else {
movi(r0, w);
LD(r0, 0, r0);
w = (jit_word_t)i0;
if (can_sign_extend_short_p(w))
LD(r0, w, _ZERO_REGNO);
else {
movi(r0, w);
LD(r0, 0, r0);
}
}
}
@ -1780,13 +1789,17 @@ dbopi(unord)
static void
_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
#if !NEW_ABI
jit_int32_t reg;
#endif
assert(_jitc->function->self.call & jit_call_varargs);
#if !NEW_ABI
/* Align, if required. */
reg = jit_get_reg(jit_class_gpr);
andi(rn(reg), r1, 7);
addr(r1, r1, rn(reg));
jit_unget_reg(reg);
#endif
/* Load argument. */
ldr_d(r0, r1);