Le 27/06/2017 à 22:00, Richard Henderson a écrit : > On 06/27/2017 12:12 PM, Laurent Vivier wrote: >> case 3: /* Ordered Greater than or Equal Z || !(A || N) */ >> case 19: /* Greater than or Equal Z || !(A || N) */ >> + g_assert(FPSR_CC_A == (FPSR_CC_N >> 3)); >> + c->v1 = tcg_temp_new(); >> + c->g1 = 0; >> + tcg_gen_shli_i32(c->v1, fpsr, 3); >> + tcg_gen_or_i32(c->v1, c->v1, fpsr); >> + tcg_gen_xori_i32(c->v1, c->v1, FPSR_CC_N); >> + tcg_gen_andi_i32(c->v1, c->v1, FPSR_CC_N | FPSR_CC_Z); >> + c->tcond = TCG_COND_NE; > > Still with the unmasked shift. > > tcg_gen_not_i32(c->v1, fpsr); > tcg_gen_andi_i32(c->v1, c->v1, FPSR_CC_A | FPSR_CC_N);
We want to compute !(A || N), but I think this is (!A || !N) > tcg_gen_andi_i32(fpsr, fpsr, FPSR_CC_Z); > tcg_gen_or_i32(c->v1, c->v1, fpsr); So we have Z || !A || !N Do you think we can do better than: tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A); tcg_gen_shli_i32(c->v1, c->v1, ctz32(FPSR_CC_N) - ctz32(FPSR_CC_A)); tcg_gen_andi_i32(fpsr, fpsr, FPSR_CC_Z | FPSR_CC_N); tcg_gen_or_i32(c->v1, c->v1, fpsr); tcg_gen_xori_i32(c->v1, c->v1, FPSR_CC_N); Thanks, Laurent