[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] target/arm: Fix SMLAD incorrect setting of Q bit
From: |
Richard Henderson |
Subject: |
Re: [PATCH] target/arm: Fix SMLAD incorrect setting of Q bit |
Date: |
Fri, 9 Oct 2020 17:34:02 -0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 |
On 10/9/20 1:47 PM, Peter Maydell wrote:
> On Fri, 9 Oct 2020 at 18:57, Richard Henderson
> <richard.henderson@linaro.org> wrote:
>>
>> On 10/9/20 9:47 AM, Peter Maydell wrote:
>>> + /*
>>> + * t1 is the low half of the result which goes into Rd.
>>> + * We have overflow and must set Q if the high half (t2)
>>> + * is different from the sign-extension of t1.
>>> + */
>>> + t3 = tcg_temp_new_i32();
>>> + tcg_gen_sari_i32(t3, t1, 31);
>>> + qf = load_cpu_field(QF);
>>> + one = tcg_const_i32(1);
>>> + tcg_gen_movcond_i32(TCG_COND_NE, qf, t2, t3, one, qf);
>>> + store_cpu_field(qf, QF);
>>
>> This works, however, QF is not restricted to {0,1}.
>
> I'm not sure if you mean "this code doesn't maintain that
> invariant" or "there is no such invariant". If the former,
> the declaration of the field in cpu.h disagrees:
> uint32_t QF; /* 0 or 1 */
Oops, I confused QF with QC, the neon saturation bit.
r~