qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 1/7] target/m68k: add fscc.


From: Laurent Vivier
Subject: Re: [Qemu-devel] [PATCH v3 1/7] target/m68k: add fscc.
Date: Wed, 28 Jun 2017 22:05:19 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0

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

[Prev in Thread] Current Thread [Next in Thread]