diff --git a/ChangeLog b/ChangeLog index 8611bda43..b5a7a754b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2012-12-04 Paulo Andrade + + * lib/jit_mips-fpu.c, lib/jit_mips.c: Implement missing mips + jit_sqrtr_{f,d} codes. + + * check/all.tst, include/lightning.h, lib/jit_print.c: Change + declaration order and call order in all.tst of {add,sub}c and + {add,sub}x. *c must be called before to set the carry and *x + second to use the carry and keep it set. The wrong call order + was causing all.tst to fail in mips, where a register is + allocated to keep a global carry state. + 2012-12-04 Paulo Andrade * include/lightning/jit_mips.h, lib/jit_mips-cpu.c, diff --git a/check/all.tst b/check/all.tst index 055da44b9..aa8856c9b 100644 --- a/check/all.tst +++ b/check/all.tst @@ -22,16 +22,16 @@ #endif addr %r0 %r1 %r2 addi %r0 %r1 2 - addxr %r0 %r1 %r2 - addxi %r0 %r1 2 addcr %r0 %r1 %r2 addci %r0 %r1 2 + addxr %r0 %r1 %r2 + addxi %r0 %r1 2 subr %r0 %r1 %r2 subi %r0 %r1 2 - subxr %r0 %r1 %r2 - subxi %r0 %r1 2 subcr %r0 %r1 %r2 subci %r0 %r1 2 + subxr %r0 %r1 %r2 + subxi %r0 %r1 2 mulr %r0 %r1 %r2 muli %r0 %r1 2 divr %r0 %r1 %r2 diff --git a/include/lightning.h b/include/lightning.h index 4209005a6..8af86e188 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -133,21 +133,21 @@ typedef enum { #define jit_addr(u,v,w) jit_new_node_www(jit_code_addr,u,v,w) #define jit_addi(u,v,w) jit_new_node_www(jit_code_addi,u,v,w) jit_code_addr, jit_code_addi, -#define jit_addxr(u,v,w) jit_new_node_www(jit_code_addxr,u,v,w) -#define jit_addxi(u,v,w) jit_new_node_www(jit_code_addxi,u,v,w) - jit_code_addxr, jit_code_addxi, #define jit_addcr(u,v,w) jit_new_node_www(jit_code_addcr,u,v,w) #define jit_addci(u,v,w) jit_new_node_www(jit_code_addci,u,v,w) jit_code_addcr, jit_code_addci, +#define jit_addxr(u,v,w) jit_new_node_www(jit_code_addxr,u,v,w) +#define jit_addxi(u,v,w) jit_new_node_www(jit_code_addxi,u,v,w) + jit_code_addxr, jit_code_addxi, #define jit_subr(u,v,w) jit_new_node_www(jit_code_subr,u,v,w) #define jit_subi(u,v,w) jit_new_node_www(jit_code_subi,u,v,w) jit_code_subr, jit_code_subi, -#define jit_subxr(u,v,w) jit_new_node_www(jit_code_subxr,u,v,w) -#define jit_subxi(u,v,w) jit_new_node_www(jit_code_subxi,u,v,w) - jit_code_subxr, jit_code_subxi, #define jit_subcr(u,v,w) jit_new_node_www(jit_code_subcr,u,v,w) #define jit_subci(u,v,w) jit_new_node_www(jit_code_subci,u,v,w) jit_code_subcr, jit_code_subci, +#define jit_subxr(u,v,w) jit_new_node_www(jit_code_subxr,u,v,w) +#define jit_subxi(u,v,w) jit_new_node_www(jit_code_subxi,u,v,w) + jit_code_subxr, jit_code_subxi, #define jit_mulr(u,v,w) jit_new_node_www(jit_code_mulr,u,v,w) #define jit_muli(u,v,w) jit_new_node_www(jit_code_muli,u,v,w) diff --git a/lib/jit_mips-fpu.c b/lib/jit_mips-fpu.c index bddbc4ae2..702a703fe 100644 --- a/lib/jit_mips-fpu.c +++ b/lib/jit_mips-fpu.c @@ -96,9 +96,11 @@ # define DIV_S(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_S,ft,fs,fd,MIPS_DIV_fmt) # define DIV_D(fd,fs,ft) hrrrit(MIPS_COP1,MIPS_fmt_D,ft,fs,fd,MIPS_DIV_fmt) # define ABS_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_ABS_fmt) -# define ABS_D(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_ABS_fmt) +# define ABS_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_ABS_fmt) # define NEG_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_NEG_fmt) -# define NEG_D(fd, fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_NEG_fmt) +# define NEG_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_NEG_fmt) +# define SQRT_S(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_S,0,fs,fd,MIPS_SQRT_fmt) +# define SQRT_D(fd,fs) hrrrit(MIPS_COP1,MIPS_fmt_D,0,fs,fd,MIPS_SQRT_fmt) # define MFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MF,rt,fs,0,0) # define MTC1(rt, fs) hrrrit(MIPS_COP1,MIPS_MT,rt,fs,0,0) # define DMFC1(rt, fs) hrrrit(MIPS_COP1,MIPS_DMF,rt,fs,0,0) @@ -208,6 +210,8 @@ static void _divi_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_float64_t*); # define absr_d(r0,r1) ABS_D(r0,r1) # define negr_f(r0,r1) NEG_S(r0,r1) # 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) # define getarg_f(r0, r1) MTC1(r1, r0) # define pushargr_f(r0, r1) MFC1(r1, r0) # define pushargi_f(r0, i0) _pushargi_f(_jit, r0, i0) diff --git a/lib/jit_mips.c b/lib/jit_mips.c index 2e220b246..f365e3c26 100644 --- a/lib/jit_mips.c +++ b/lib/jit_mips.c @@ -973,6 +973,7 @@ _jit_emit(jit_state_t *_jit) case_rrf(div, _f, 32); case_rr(abs, _f); case_rr(neg, _f); + case_rr(sqrt, _f); case_rr(ext, _f); case_rr(ld, _f); case_rw(ld, _f); @@ -1054,6 +1055,7 @@ _jit_emit(jit_state_t *_jit) case_rrf(div, _d, 64); case_rr(abs, _d); case_rr(neg, _d); + case_rr(sqrt, _d); case_rr(ext, _d); case_rr(ld, _d); case_rw(ld, _d); diff --git a/lib/jit_print.c b/lib/jit_print.c index 151ddba61..e05e3535a 100644 --- a/lib/jit_print.c +++ b/lib/jit_print.c @@ -41,11 +41,11 @@ static char *code_name[] = { "label", "prolog", "addr", "addi", - "addxr", "addxi", "addcr", "addci", + "addxr", "addxi", "subr", "subi", - "subxr", "subxi", "subcr", "subci", + "subxr", "subxi", "mulr", "muli", "divr", "divi", "divr_u", "divi_u",