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

Reply via email to