qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v5 30/35] target/arm: Pass index to AdvSIMD FCML


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH v5 30/35] target/arm: Pass index to AdvSIMD FCMLA (indexed)
Date: Tue, 26 Jun 2018 08:07:36 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0

On 06/26/2018 06:38 AM, Peter Maydell wrote:
> On 21 June 2018 at 02:53, Richard Henderson
> <address@hidden> wrote:
>> The original commit failed to pass, or use, the index.
>>
>> Fixes: d17b7cdcf4ea
>> Signed-off-by: Richard Henderson <address@hidden>
>> ---
>>  target/arm/translate-a64.c | 21 ++++++++++++---------
>>  target/arm/vec_helper.c    | 10 ++++++----
>>  2 files changed, 18 insertions(+), 13 deletions(-)
>>
>> diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
>> index 8d8a4cecb0..038e48278f 100644
>> --- a/target/arm/translate-a64.c
>> +++ b/target/arm/translate-a64.c
>> @@ -12669,15 +12669,18 @@ static void disas_simd_indexed(DisasContext *s, 
>> uint32_t insn)
>>      case 0x13: /* FCMLA #90 */
>>      case 0x15: /* FCMLA #180 */
>>      case 0x17: /* FCMLA #270 */
>> -        tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
>> -                           vec_full_reg_offset(s, rn),
>> -                           vec_reg_offset(s, rm, index, size), fpst,
>> -                           is_q ? 16 : 8, vec_full_reg_size(s),
>> -                           extract32(insn, 13, 2), /* rot */
>> -                           size == MO_64
>> -                           ? gen_helper_gvec_fcmlas_idx
>> -                           : gen_helper_gvec_fcmlah_idx);
>> -        tcg_temp_free_ptr(fpst);
>> +        {
>> +            int rot = extract32(insn, 13, 2);
>> +            int data = index * 4 + rot;
> 
> Using arithmetic to do bit operations again.
> 
>> +            tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
>> +                               vec_full_reg_offset(s, rn),
>> +                               vec_reg_offset(s, rm, index, size), fpst,
>> +                               is_q ? 16 : 8, vec_full_reg_size(s), data,
>> +                               size == MO_64
>> +                               ? gen_helper_gvec_fcmlas_idx
>> +                               : gen_helper_gvec_fcmlah_idx);
> 
> We're already using vec_reg_offset() to pass the helper the address
> of the index'th element in Vm -- why do we need to also add
> 2*index when we use that pointer as an array base in the helper?

Ah, bug.  Because of SVE, we must pass index (since it applies per 128-bit
segment), and we should pass the full_reg as the pointer.


r~



reply via email to

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