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

Implement the jit_rsb* interface.

* check/alu_rsb.ok, check/alu_rsb.tst: New files implementing
	tests for jit_rsb*.

	* check/Makefile.am, check/lightning.c, include/lightning.h,
	lib/jit_aarch64-cpu.c, lib/jit_aarch64-fpu.c, lib/jit_aarch64-sz.c,
	lib/jit_aarch64.c, lib/jit_alpha-cpu.c, lib/jit_alpha-fpu.c,
	lib/jit_alpha-sz.c, lib/jit_alpha.c, lib/jit_arm-cpu.c,
	lib/jit_arm-swf.c, lib/jit_arm-sz.c, lib/jit_arm-vfp.c,
	lib/jit_arm.c, lib/jit_hppa-cpu.c, lib/jit_hppa-fpu.c,
	lib/jit_hppa-sz.c, lib/jit_hppa.c, lib/jit_ia64-cpu.c,
	lib/jit_ia64-fpu.c, lib/jit_ia64-sz.c, lib/jit_ia64.c,
	lib/jit_mips-cpu.c, lib/jit_mips-fpu.c, lib/jit_mips-sz.c,
	lib/jit_mips.c, lib/jit_names.c, lib/jit_ppc-cpu.c,
	lib/jit_ppc-fpu.c, lib/jit_ppc-sz.c, lib/jit_ppc.c,
	lib/jit_s390x-cpu.c, lib/jit_s390x-fpu.c, lib/jit_s390x-sz.c,
	lib/jit_s390x.c, lib/jit_sparc-cpu.c, lib/jit_sparc-fpu.c,
	lib/jit_sparc-sz.c, lib/jit_sparc.c, lib/jit_x86-cpu.c,
	lib/jit_x86-sse.c, lib/jit_x86-sz.c, lib/jit_x86-x87.c,
	lib/jit_x86.c, lib/lightning.c: Implement jit_rsb*. This
	was a missing lightning 1.x interface, that on most
	backends is synthesized, but on a few backends (hppa and ia64),
	it can generate better code as on those there is, or the
	only instruction with an immediate is in "rsb" format
	(left operand).
This commit is contained in:
pcpa 2014-10-18 11:31:18 -03:00
parent 624cf33d08
commit 960280decd
50 changed files with 494 additions and 44 deletions

View file

@ -152,6 +152,12 @@ static void _swf_negr_d(jit_state_t*,jit_int32_t,jit_int32_t);
# define swf_subi_f(r0,r1,i0) swf_fff_(__aeabi_fsub,r0,r1,i0)
# define swf_subr_d(r0,r1,r2) swf_ddd(__aeabi_dsub,r0,r1,r2)
# define swf_subi_d(r0,r1,i0) swf_ddd_(__aeabi_dsub,r0,r1,i0)
# define swf_rsbr_f(r0, r1, r2) swf_subr_f(r0, r2, r1)
# define swf_rsbi_f(r0, r1, i0) _swf_rsbi_f(_jit, r0, r1, i0)
static void _swf_rsbi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_float32_t);
# define swf_rsbr_d(r0, r1, r2) swf_subr_d(r0, r2, r1)
# define swf_rsbi_d(r0, r1, i0) _swf_rsbi_d(_jit, r0, r1, i0)
static void _swf_rsbi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t);
# define swf_mulr_f(r0,r1,r2) swf_fff(__aeabi_fmul,r0,r1,r2)
# define swf_muli_f(r0,r1,i0) swf_fff_(__aeabi_fmul,r0,r1,i0)
# define swf_mulr_d(r0,r1,r2) swf_ddd(__aeabi_dmul,r0,r1,r2)
@ -690,6 +696,28 @@ _swf_fff_(jit_state_t *_jit, float (*i0)(float, float),
jit_unget_reg_args();
}
static void
_swf_rsbi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float32_t i0)
{
union {
jit_int32_t i;
jit_float32_t f;
} data;
jit_get_reg_args();
data.f = i0;
movi(_R0_REGNO, data.i);
if (jit_fpr_p(r1))
swf_ldrin(_R1_REGNO, _FP_REGNO, swf_off(r1) + 8);
else
movr(_R1_REGNO, r1);
swf_call(__aeabi_fsub, fallback, _R3_REGNO);
if (jit_fpr_p(r0))
swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
else
movr(r0, _R0_REGNO);
jit_unget_reg_args();
}
static void
_swf_ddd_(jit_state_t *_jit, double (*i0)(double, double),
jit_int32_t r0, jit_int32_t r1, jit_float64_t i1)
@ -699,6 +727,7 @@ _swf_ddd_(jit_state_t *_jit, double (*i0)(double, double),
jit_float64_t d;
} data;
jit_get_reg_args();
data.d = i1;
if (jit_fpr_p(r1)) {
if (!jit_thumb_p() && jit_armv5e_p())
@ -730,6 +759,45 @@ _swf_ddd_(jit_state_t *_jit, double (*i0)(double, double),
jit_unget_reg_args();
}
static void
_swf_rsbi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_float64_t i0)
{
union {
jit_int32_t i[2];
jit_float64_t d;
} data;
jit_get_reg_args();
data.d = i0;
movi(_R0_REGNO, data.i[0]);
movi(_R1_REGNO, data.i[1]);
if (jit_fpr_p(r1)) {
if (!jit_thumb_p() && jit_armv5e_p())
LDRDIN(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
else {
swf_ldrin(_R2_REGNO, _FP_REGNO, swf_off(r1) + 8);
swf_ldrin(_R3_REGNO, _FP_REGNO, swf_off(r1) + 4);
}
}
else {
movr(_R2_REGNO, r1);
movr(_R3_REGNO, r1 + 1);
}
swf_call_with_get_reg(__aeabi_dsub, fallback);
if (jit_fpr_p(r0)) {
if (!jit_thumb_p() && jit_armv5e_p())
STRDIN(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
else {
swf_strin(_R0_REGNO, _FP_REGNO, swf_off(r0) + 8);
swf_strin(_R1_REGNO, _FP_REGNO, swf_off(r0) + 4);
}
}
else {
movr(r0, _R0_REGNO);
movr(r0 + 1, _R1_REGNO);
}
jit_unget_reg_args();
}
static void
_swf_iff(jit_state_t *_jit, int (*i0)(float, float),
jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)