diff --git a/ChangeLog b/ChangeLog index 8f432ef60..3b79a3fd8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-08-20 Paolo Bonzini + + * lightning/i386/fp-64.h: Return patch address from jit_bXYr_{f,d}. + Reported by Paulo César Pereira de Andrade. + * lightning/ppc/fp.h: Likewise. + * lightning/sparc/fp.h: Implement FP branches. + 2010-08-18 Paolo Bonzini * lightning/i386/fp-64.h: Fix jp in jit_bner_{f,d}. diff --git a/lightning/i386/fp-64.h b/lightning/i386/fp-64.h index 9bb2681ec..bb4b65ffc 100644 --- a/lightning/i386/fp-64.h +++ b/lightning/i386/fp-64.h @@ -230,35 +230,35 @@ union jit_double_imm { SBBLir (0, (rd)); \ } while (0) -#define jit_bltr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JAm ((d))) -#define jit_bler_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JAEm ((d))) -#define jit_beqr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), _OO (0x7a06), JEm ((d))) -#define jit_bner_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), _OO (0x7a02), _OO (0x7405), JMPm (((d)))) /* JP to JMP, JZ past JMP */ -#define jit_bger_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JAEm ((d))) -#define jit_bgtr_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JAm ((d))) -#define jit_bunltr_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JNAEm ((d))) -#define jit_bunler_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JNAm ((d))) -#define jit_buneqr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JEm ((d))) -#define jit_bltgtr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNEm ((d))) -#define jit_bunger_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNAm ((d))) -#define jit_bungtr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNAEm ((d))) -#define jit_bordr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNPm ((d))) -#define jit_bunordr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JPm ((d))) +#define jit_bltr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JAm ((d)), _jit.x.pc) +#define jit_bler_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JAEm ((d)), _jit.x.pc) +#define jit_beqr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), _OO (0x7a06), JEm ((d)), _jit.x.pc) +#define jit_bner_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), _OO (0x7a02), _OO (0x7405), JMPm (((d))), _jit.x.pc) /* JP to JMP, JZ past JMP */ +#define jit_bger_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JAEm ((d)), _jit.x.pc) +#define jit_bgtr_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JAm ((d)), _jit.x.pc) +#define jit_bunltr_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JNAEm ((d)), _jit.x.pc) +#define jit_bunler_f(d, s1, s2) (UCOMISSrr ((s2), (s1)), JNAm ((d)), _jit.x.pc) +#define jit_buneqr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JEm ((d)), _jit.x.pc) +#define jit_bltgtr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNEm ((d)), _jit.x.pc) +#define jit_bunger_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNAm ((d)), _jit.x.pc) +#define jit_bungtr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNAEm ((d)), _jit.x.pc) +#define jit_bordr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JNPm ((d)), _jit.x.pc) +#define jit_bunordr_f(d, s1, s2) (UCOMISSrr ((s1), (s2)), JPm ((d)), _jit.x.pc) -#define jit_bltr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JAm ((d))) -#define jit_bler_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JAEm ((d))) -#define jit_beqr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), _OO (0x7a06), JEm ((d))) -#define jit_bner_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), _OO (0x7a02), _OO (0x7405), JMPm (((d)))) /* JP to JMP, JZ past JMP */ -#define jit_bger_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JAEm ((d))) -#define jit_bgtr_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JAm ((d))) -#define jit_bunltr_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JNAEm ((d))) -#define jit_bunler_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JNAm ((d))) -#define jit_buneqr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JEm ((d))) -#define jit_bltgtr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNEm ((d))) -#define jit_bunger_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNAm ((d))) -#define jit_bungtr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNAEm ((d))) -#define jit_bordr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNPm ((d))) -#define jit_bunordr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JPm ((d))) +#define jit_bltr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JAm ((d)), _jit.x.pc) +#define jit_bler_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JAEm ((d)), _jit.x.pc) +#define jit_beqr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), _OO (0x7a06), JEm ((d)), _jit.x.pc) +#define jit_bner_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), _OO (0x7a02), _OO (0x7405), JMPm (((d))), _jit.x.pc) /* JP to JMP, JZ past JMP */ +#define jit_bger_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JAEm ((d)), _jit.x.pc) +#define jit_bgtr_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JAm ((d)), _jit.x.pc) +#define jit_bunltr_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JNAEm ((d)), _jit.x.pc, _jit.x.pc) +#define jit_bunler_d(d, s1, s2) (UCOMISDrr ((s2), (s1)), JNAm ((d)), _jit.x.pc) +#define jit_buneqr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JEm ((d)), _jit.x.pc) +#define jit_bltgtr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNEm ((d)), _jit.x.pc) +#define jit_bunger_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNAm ((d)), _jit.x.pc) +#define jit_bungtr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNAEm ((d)), _jit.x.pc) +#define jit_bordr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JNPm ((d)), _jit.x.pc) +#define jit_bunordr_d(d, s1, s2) (UCOMISDrr ((s1), (s2)), JPm ((d)), _jit.x.pc) #define jit_ltr_f(d, s1, s2) (XORLrr ((d), (d)), UCOMISSrr ((s1), (s2)), SETAr (jit_reg8((d)))) #define jit_ler_f(d, s1, s2) (XORLrr ((d), (d)), UCOMISSrr ((s1), (s2)), SETAEr (jit_reg8((d)))) diff --git a/lightning/ppc/fp.h b/lightning/ppc/fp.h index 2841e9a98..feed42ce5 100644 --- a/lightning/ppc/fp.h +++ b/lightning/ppc/fp.h @@ -143,24 +143,29 @@ #define jit_fpbr(d, s1, s2, rcbit) ( \ FCMPOrrr(_cr0,(s1),(s2)), \ - BTii ((rcbit), (d))) + BTii ((rcbit), (d)), \ + _jit.x.pc) #define jit_fpbr_neg(d, s1, s2,rcbit) ( \ FCMPOrrr(_cr0,(s1),(s2)), \ - BFii ((rcbit), (d))) + BFii ((rcbit), (d)), \ + _jit.x.pc) #define jit_fpbur(d, s1, s2, rcbit) ( \ FCMPUrrr(_cr0,(s1),(s2)), \ - BTii ((rcbit), (d))) + BTii ((rcbit), (d)), \ + _jit.x.pc) #define jit_fpbur_neg(d, s1, s2,rcbit) ( \ FCMPUrrr(_cr0,(s1),(s2)), \ - BFii ((rcbit), (d))) + BFii ((rcbit), (d)), \ + _jit.x.pc) #define jit_fpbur_or(d, s1, s2, bit1, bit2) ( \ FCMPUrrr(_cr0,(s1),(s2)), \ CRORiii((bit1), (bit1), (bit2)), \ - BTii ((bit1), (d))) + BTii ((bit1), (d)), \ + _jit.x.pc) #define jit_bgtr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_gt) #define jit_bger_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_lt) diff --git a/lightning/sparc/fp.h b/lightning/sparc/fp.h index 45b6d66a1..bdfc626d0 100644 --- a/lightning/sparc/fp.h +++ b/lightning/sparc/fp.h @@ -205,6 +205,38 @@ #define jit_unordr_d(d, s1, s2) (FCMPDrr ((s1), (s2)), FBUi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d))) #define jit_unordr_f(d, s1, s2) (FCMPSrr ((s1), (s2)), FBUi(_jit.x.pc + 3), MOVir (1, (d)), MOVir (0, (d))) +#define jit_branchr_f(s1, s2, jmp) (FCMPSrr(s1, s2), jmp, NOP(), _jit.x.pc - 1) +#define jit_branchr_d(s1, s2, jmp) (FCMPDrr(s1, s2), jmp, NOP(), _jit.x.pc - 1) + +#define jit_bltr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBLi((label))) +#define jit_bltr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBLi((label))) +#define jit_bler_d(label, s1, s2) jit_branchr_d((s1), (s2), FBLEi((label))) +#define jit_bler_f(label, s1, s2) jit_branchr_f((s1), (s2), FBLEi((label))) +#define jit_beqr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBEi((label))) +#define jit_beqr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBEi((label))) +#define jit_bner_d(label, s1, s2) jit_branchr_d((s1), (s2), FBNEi((label))) +#define jit_bner_f(label, s1, s2) jit_branchr_f((s1), (s2), FBNEi((label))) +#define jit_bger_d(label, s1, s2) jit_branchr_d((s1), (s2), FBGEi((label))) +#define jit_bger_f(label, s1, s2) jit_branchr_f((s1), (s2), FBGEi((label))) +#define jit_bgtr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBGi((label))) +#define jit_bgtr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBGi((label))) +#define jit_bunltr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBULi((label))) +#define jit_bunltr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBULi((label))) +#define jit_bunler_d(label, s1, s2) jit_branchr_d((s1), (s2), FBULEi((label))) +#define jit_bunler_f(label, s1, s2) jit_branchr_f((s1), (s2), FBULEi((label))) +#define jit_buneqr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBUEi((label))) +#define jit_buneqr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBUEi((label))) +#define jit_bltgtr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBLGi((label))) +#define jit_bltgtr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBLGi((label))) +#define jit_bunger_d(label, s1, s2) jit_branchr_d((s1), (s2), FBUGEi((label))) +#define jit_bunger_f(label, s1, s2) jit_branchr_f((s1), (s2), FBUGEi((label))) +#define jit_bungtr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBUGi((label))) +#define jit_bungtr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBUGi((label))) +#define jit_bordr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBOi((label))) +#define jit_bordr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBOi((label))) +#define jit_bunordr_d(label, s1, s2) jit_branchr_d((s1), (s2), FBUi((label))) +#define jit_bunordr_f(label, s1, s2) jit_branchr_f((s1), (s2), FBUi((label))) + #define jit_prepare_f(num) (_jitl.nextarg_put += (num)) #define jit_prepare_d(num) (_jitl.nextarg_put += 2 * (num))