1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-28 22:10:29 +02:00

Correct all ldst test cases.

* lib/jit_ia64-cpu.c: Correct bogus implementation of ldr_T
	for signed integers, that was using ld1.s, ld2.s and ld4.s.
	The ".s" stands for speculative load, not sign extend.

	* lib/jit_ia64-fpu.c: Correct bogus implementation of ldxr_T
	for float and double. The third (actually, second) argument
	is indeed added to the base register, but the base register
	is modified. The actual M7 implementation was already correct,
	just the ldxr_f and ldxr_d implementation that was kept in
	a prototype state, misinterpreting what M7 does.
This commit is contained in:
pcpa 2013-04-27 16:13:44 -03:00
parent 2475ae88d4
commit f52b976390
3 changed files with 110 additions and 51 deletions

View file

@ -1,3 +1,16 @@
2013-04-27 Paulo Andrade <pcpa@gnu.org>
* lib/jit_ia64-cpu.c: Correct bogus implementation of ldr_T
for signed integers, that was using ld1.s, ld2.s and ld4.s.
The ".s" stands for speculative load, not sign extend.
* lib/jit_ia64-fpu.c: Correct bogus implementation of ldxr_T
for float and double. The third (actually, second) argument
is indeed added to the base register, but the base register
is modified. The actual M7 implementation was already correct,
just the ldxr_f and ldxr_d implementation that was kept in
a prototype state, misinterpreting what M7 does.
2013-04-27 Paulo Andrade <pcpa@gnu.org>
* lib/jit_ia64-cpu.c: Correct X2 pattern matching by preventing

View file

@ -1328,19 +1328,22 @@ static jit_word_t _bsubi_u(jit_state_t*,jit_word_t,
#define bxsubi(i0,r0,i1) bsubi(i0,r0,i1,0)
#define bxsubr_u(i0,r0,r1) bsubr_u(i0,r0,r1,0)
#define bxsubi_u(i0,r0,i1) bsubi_u(i0,r0,i1,0)
#define ldr_c(r0,r1) LD1_S(r0,r1)
#define ldr_c(r0,r1) _ldr_c(_jit,r0,r1)
static void _ldr_c(jit_state_t*,jit_int32_t,jit_int32_t);
#define ldi_c(r0,i0) _ldi_c(_jit,r0,i0)
static void _ldi_c(jit_state_t*,jit_int32_t,jit_word_t);
#define ldr_uc(r0,r1) LD1(r0,r1)
#define ldi_uc(r0,i0) _ldi_uc(_jit,r0,i0)
static void _ldi_uc(jit_state_t*,jit_int32_t,jit_word_t);
#define ldr_s(r0,r1) LD2_S(r0,r1)
#define ldr_s(r0,r1) _ldr_s(_jit,r0,r1)
static void _ldr_s(jit_state_t*,jit_int32_t,jit_int32_t);
#define ldi_s(r0,i0) _ldi_s(_jit,r0,i0)
static void _ldi_s(jit_state_t*,jit_int32_t,jit_word_t);
#define ldr_us(r0,r1) LD2(r0,r1)
#define ldi_us(r0,i0) _ldi_us(_jit,r0,i0)
static void _ldi_us(jit_state_t*,jit_int32_t,jit_word_t);
#define ldr_i(r0,r1) LD4_S(r0,r1)
#define ldr_i(r0,r1) _ldr_i(_jit,r0,r1)
static void _ldr_i(jit_state_t*,jit_int32_t,jit_int32_t);
#define ldi_i(r0,i0) _ldi_i(_jit,r0,i0)
static void _ldi_i(jit_state_t*,jit_int32_t,jit_word_t);
#define ldr_ui(r0,r1) LD4(r0,r1)
@ -4045,6 +4048,13 @@ _nei(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
MOVI_p(r0, 1, PR_7);
}
static void
_ldr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
ldr_uc(r0, r1);
extr_c(r0, r0);
}
static void
_ldi_c(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
@ -4065,6 +4075,13 @@ _ldi_uc(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
static void
_ldr_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
ldr_us(r0, r1);
extr_s(r0, r0);
}
static void
_ldi_s(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{
@ -4085,6 +4102,13 @@ _ldi_us(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
static void
_ldr_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
{
ldr_ui(r0, r1);
extr_i(r0, r0);
}
static void
_ldi_i(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
{

View file

@ -304,52 +304,52 @@ static void F16_(jit_state_t*,jit_word_t,
#define LDFD_C_NC(f1,r3) M9(0x27,LD_NONE,r3,f1)
#define LDF8_C_NC(f1,r3) M9(0x25,LD_NONE,r3,f1)
#define LDFE_C_NC(f1,r3) M9(0x24,LD_NONE,r3,f1)
#define LDXFS(f1,r3,r2) M7(0x02,LD_NONE,r3,r2,f1)
#define LDXFD(f1,r3,r2) M7(0x03,LD_NONE,r3,r2,f1)
#define LDXF8(f1,r3,r2) M7(0x01,LD_NONE,r3,r2,f1)
#define LDXFE(f1,r3,r2) M7(0x00,LD_NONE,r3,r2,f1)
#define LDXFS_S(f1,r3,r2) M7(0x06,LD_NONE,r3,r2,f1)
#define LDXFD_S(f1,r3,r2) M7(0x07,LD_NONE,r3,r2,f1)
#define LDXF8_S(f1,r3,r2) M7(0x05,LD_NONE,r3,r2,f1)
#define LDXFE_S(f1,r3,r2) M7(0x04,LD_NONE,r3,r2,f1)
#define LDXFS_A(f1,r3,r2) M7(0x0a,LD_NONE,r3,r2,f1)
#define LDXFD_A(f1,r3,r2) M7(0x0b,LD_NONE,r3,r2,f1)
#define LDXF8_A(f1,r3,r2) M7(0x09,LD_NONE,r3,r2,f1)
#define LDXFE_A(f1,r3,r2) M7(0x08,LD_NONE,r3,r2,f1)
#define LDXFS_SA(f1,r3,r2) M7(0x0e,LD_NONE,r3,r2,f1)
#define LDXFD_SA(f1,r3,r2) M7(0x0f,LD_NONE,r3,r2,f1)
#define LDXF8_SA(f1,r3,r2) M7(0x0d,LD_NONE,r3,r2,f1)
#define LDXFE_SA(f1,r3,r2) M7(0x0c,LD_NONE,r3,r2,f1)
#define LDXFS_FILL(f1,r3,r2) M7(0x1b,LD_NONE,r3,r2,f1)
#define LDXFS_C_CLR(f1,r3,r2) M7(0x22,LD_NONE,r3,r2,f1)
#define LDXFD_C_CLR(f1,r3,r2) M7(0x23,LD_NONE,r3,r2,f1)
#define LDXF8_C_CLR(f1,r3,r2) M7(0x21,LD_NONE,r3,r2,f1)
#define LDXFE_C_CLR(f1,r3,r2) M7(0x20,LD_NONE,r3,r2,f1)
#define LDXFS_C_NC(f1,r3,r2) M7(0x26,LD_NONE,r3,r2,f1)
#define LDXFD_C_NC(f1,r3,r2) M7(0x27,LD_NONE,r3,r2,f1)
#define LDXF8_C_NC(f1,r3,r2) M7(0x25,LD_NONE,r3,r2,f1)
#define LDXFE_C_NC(f1,r3,r2) M7(0x24,LD_NONE,r3,r2,f1)
#define LDFS_inc(f1,f3,im) M8(0x02,LD_NONE,f3,im,f1)
#define LDFD_inc(f1,f3,im) M8(0x03,LD_NONE,f3,im,f1)
#define LDF8_inc(f1,f3,im) M8(0x01,LD_NONE,f3,im,f1)
#define LDFE_inc(f1,f3,im) M8(0x00,LD_NONE,f3,im,f1)
#define LDFS_S_inc(f1,f3,im) M8(0x06,LD_NONE,f3,im,f1)
#define LDFD_S_inc(f1,f3,im) M8(0x07,LD_NONE,f3,im,f1)
#define LDF8_S_inc(f1,f3,im) M8(0x05,LD_NONE,f3,im,f1)
#define LDFE_S_inc(f1,f3,im) M8(0x04,LD_NONE,f3,im,f1)
#define LDFS_A_inc(f1,f3,im) M8(0x0a,LD_NONE,f3,im,f1)
#define LDFD_A_inc(f1,f3,im) M8(0x0b,LD_NONE,f3,im,f1)
#define LDF8_A_inc(f1,f3,im) M8(0x09,LD_NONE,f3,im,f1)
#define LDFE_A_inc(f1,f3,im) M8(0x08,LD_NONE,f3,im,f1)
#define LDF_FILL_inc(f1,f3,im) M8(0x1b,LD_NONE,f3,im,f1)
#define LDFS_C_CLR_inc(f1,f3,im) M8(0x22,LD_NONE,f3,im,f1)
#define LDFD_C_CLR_inc(f1,f3,im) M8(0x23,LD_NONE,f3,im,f1)
#define LDF8_C_CLR_inc(f1,f3,im) M8(0x21,LD_NONE,f3,im,f1)
#define LDFE_C_CLR_inc(f1,f3,im) M8(0x20,LD_NONE,f3,im,f1)
#define LDFS_C_NC_inc(f1,f3,im) M8(0x26,LD_NONE,f3,im,f1)
#define LDFD_C_NC_inc(f1,f3,im) M8(0x27,LD_NONE,f3,im,f1)
#define LDF8_C_NC_inc(f1,f3,im) M8(0x25,LD_NONE,f3,im,f1)
#define LDFE_C_NC_inc(f1,f3,im) M8(0x24,LD_NONE,f3,im,f1)
#define LDFS_inc(f1,r3,r2) M7(0x02,LD_NONE,r3,r2,f1)
#define LDFD_inc(f1,r3,r2) M7(0x03,LD_NONE,r3,r2,f1)
#define LDF8_inc(f1,r3,r2) M7(0x01,LD_NONE,r3,r2,f1)
#define LDFE_inc(f1,r3,r2) M7(0x00,LD_NONE,r3,r2,f1)
#define LDFS_S_inc(f1,r3,r2) M7(0x06,LD_NONE,r3,r2,f1)
#define LDFD_S_inc(f1,r3,r2) M7(0x07,LD_NONE,r3,r2,f1)
#define LDF8_S_inc(f1,r3,r2) M7(0x05,LD_NONE,r3,r2,f1)
#define LDFE_S_inc(f1,r3,r2) M7(0x04,LD_NONE,r3,r2,f1)
#define LDFS_A_inc(f1,r3,r2) M7(0x0a,LD_NONE,r3,r2,f1)
#define LDXFD_A_inc(f1,r3,r2) M7(0x0b,LD_NONE,r3,r2,f1)
#define LDXF8_A_inc(f1,r3,r2) M7(0x09,LD_NONE,r3,r2,f1)
#define LDXFE_A_inc(f1,r3,r2) M7(0x08,LD_NONE,r3,r2,f1)
#define LDXFS_SA_inc(f1,r3,r2) M7(0x0e,LD_NONE,r3,r2,f1)
#define LDXFD_SA_inc(f1,r3,r2) M7(0x0f,LD_NONE,r3,r2,f1)
#define LDXF8_SA_inc(f1,r3,r2) M7(0x0d,LD_NONE,r3,r2,f1)
#define LDXFE_SA_inc(f1,r3,r2) M7(0x0c,LD_NONE,r3,r2,f1)
#define LDXFS_FILL_inc(f1,r3,r2) M7(0x1b,LD_NONE,r3,r2,f1)
#define LDXFS_C_CLR_inc(f1,r3,r2) M7(0x22,LD_NONE,r3,r2,f1)
#define LDXFD_C_CLR_inc(f1,r3,r2) M7(0x23,LD_NONE,r3,r2,f1)
#define LDXF8_C_CLR_inc(f1,r3,r2) M7(0x21,LD_NONE,r3,r2,f1)
#define LDXFE_C_CLR_inc(f1,r3,r2) M7(0x20,LD_NONE,r3,r2,f1)
#define LDXFS_C_NC_inc(f1,r3,r2) M7(0x26,LD_NONE,r3,r2,f1)
#define LDXFD_C_NC_inc(f1,r3,r2) M7(0x27,LD_NONE,r3,r2,f1)
#define LDXF8_C_NC_inc(f1,r3,r2) M7(0x25,LD_NONE,r3,r2,f1)
#define LDXFE_C_NC_inc(f1,r3,r2) M7(0x24,LD_NONE,r3,r2,f1)
#define LDIFS_inc(f1,f3,im) M8(0x02,LD_NONE,f3,im,f1)
#define LDIFD_inc(f1,f3,im) M8(0x03,LD_NONE,f3,im,f1)
#define LDIF8_inc(f1,f3,im) M8(0x01,LD_NONE,f3,im,f1)
#define LDIFE_inc(f1,f3,im) M8(0x00,LD_NONE,f3,im,f1)
#define LDIFS_S_inc(f1,f3,im) M8(0x06,LD_NONE,f3,im,f1)
#define LDIFD_S_inc(f1,f3,im) M8(0x07,LD_NONE,f3,im,f1)
#define LDIF8_S_inc(f1,f3,im) M8(0x05,LD_NONE,f3,im,f1)
#define LDIFE_S_inc(f1,f3,im) M8(0x04,LD_NONE,f3,im,f1)
#define LDIFS_A_inc(f1,f3,im) M8(0x0a,LD_NONE,f3,im,f1)
#define LDIFD_A_inc(f1,f3,im) M8(0x0b,LD_NONE,f3,im,f1)
#define LDIF8_A_inc(f1,f3,im) M8(0x09,LD_NONE,f3,im,f1)
#define LDIFE_A_inc(f1,f3,im) M8(0x08,LD_NONE,f3,im,f1)
#define LDIF_FILL_inc(f1,f3,im) M8(0x1b,LD_NONE,f3,im,f1)
#define LDIFS_C_CLR_inc(f1,f3,im) M8(0x22,LD_NONE,f3,im,f1)
#define LDIFD_C_CLR_inc(f1,f3,im) M8(0x23,LD_NONE,f3,im,f1)
#define LDIF8_C_CLR_inc(f1,f3,im) M8(0x21,LD_NONE,f3,im,f1)
#define LDIFE_C_CLR_inc(f1,f3,im) M8(0x20,LD_NONE,f3,im,f1)
#define LDIFS_C_NC_inc(f1,f3,im) M8(0x26,LD_NONE,f3,im,f1)
#define LDIFD_C_NC_inc(f1,f3,im) M8(0x27,LD_NONE,f3,im,f1)
#define LDIF8_C_NC_inc(f1,f3,im) M8(0x25,LD_NONE,f3,im,f1)
#define LDIFE_C_NC_inc(f1,f3,im) M8(0x24,LD_NONE,f3,im,f1)
/* ldpf */
#define LDFPS(f1,f2,r3) M11(0x02,LD_NONE,r3,f2,f1)
#define LDFPD(f1,f2,r3) M11(0x03,LD_NONE,r3,f2,f1)
@ -577,15 +577,17 @@ static void _unordi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*);
#define ldr_f(r0,r1) LDFS(r0,r1)
#define ldi_f(r0,i0) _ldi_f(_jit,r0,i0)
static void _ldi_f(jit_state_t*,jit_int32_t,jit_word_t);
#define ldxr_f(r0,r1,r2) LDXFS(r0,r1,r2)
#define ldxr_f(r0,r1,r2) _ldxr_f(_jit,r0,r1,r2)
static void _ldxr_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
#define ldxi_f(r0,r1,i0) _ldxi_f(_jit,r0,r1,i0)
static void _ldxi_f(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
#define ldr_d(r0,r1) LDFD(r0,r1)
#define ldi_d(r0,i0) _ldi_d(_jit,r0,i0)
static void _ldi_d(jit_state_t*,jit_int32_t,jit_word_t);
#define ldxr_d(r0,r1,r2) _ldxr_d(_jit,r0,r1,r2)
static void _ldxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
#define ldxi_d(r0,r1,i0) _ldxi_d(_jit,r0,r1,i0)
static void _ldxi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
#define ldxr_d(r0,r1,r2) LDXFD(r0,r1,r2)
#define str_f(r0,r1) STFS(r0,r1)
#define sti_f(i0,r0) _sti_f(_jit,i0,r0)
static void _sti_f(jit_state_t*,jit_word_t,jit_int32_t);
@ -1281,6 +1283,16 @@ _ldi_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
static void
_ldxr_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
addr(rn(reg), r1, r2);
ldr_f(r0, rn(reg));
jit_unget_reg(reg);
}
static void
_ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{
@ -1301,6 +1313,16 @@ _ldi_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
jit_unget_reg(reg);
}
static void
_ldxr_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
{
jit_int32_t reg;
reg = jit_get_reg(jit_class_gpr);
addr(rn(reg), r1, r2);
ldr_d(r0, rn(reg));
jit_unget_reg(reg);
}
static void
_ldxi_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
{