From f52b976390fada608126b49499f291cbe1d88017 Mon Sep 17 00:00:00 2001 From: pcpa Date: Sat, 27 Apr 2013 16:13:44 -0300 Subject: [PATCH] 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. --- ChangeLog | 13 +++++ lib/jit_ia64-cpu.c | 30 ++++++++++-- lib/jit_ia64-fpu.c | 118 +++++++++++++++++++++++++++------------------ 3 files changed, 110 insertions(+), 51 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4053b9fdd..47ffd90fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2013-04-27 Paulo Andrade + + * 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 * lib/jit_ia64-cpu.c: Correct X2 pattern matching by preventing diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c index d817fbf3b..8ae73f400 100644 --- a/lib/jit_ia64-cpu.c +++ b/lib/jit_ia64-cpu.c @@ -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) { diff --git a/lib/jit_ia64-fpu.c b/lib/jit_ia64-fpu.c index 907afa959..0479bf695 100644 --- a/lib/jit_ia64-fpu.c +++ b/lib/jit_ia64-fpu.c @@ -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) {