diff mbox series

[1/1] target/loongarch: LL.{W/D} need writes val to dest register after sign extension

Message ID 20230202031655.953888-1-gaosong@loongson.cn
State New
Headers show
Series [1/1] target/loongarch: LL.{W/D} need writes val to dest register after sign extension | expand

Commit Message

gaosong Feb. 2, 2023, 3:16 a.m. UTC
The Manual 2.2.7.2:
    'The LL.{W/D} instruction retrieves a word/double-word data from
    the specified address of the memory and writes it to the general
    register rd after sign extension.'

Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 target/loongarch/insn_trans/trans_atomic.c.inc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Richard Henderson Feb. 2, 2023, 5:51 a.m. UTC | #1
On 2/1/23 17:16, Song Gao wrote:
> The Manual 2.2.7.2:
>      'The LL.{W/D} instruction retrieves a word/double-word data from
>      the specified address of the memory and writes it to the general
>      register rd after sign extension.'
> 
> Signed-off-by: Song Gao <gaosong@loongson.cn>
> ---
>   target/loongarch/insn_trans/trans_atomic.c.inc | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)

The sign-extension is provided by

TRANS(ll_w, gen_ll, MO_TESL)
                     ^^^^^^^
this.

So what's the issue?


r~

> 
> diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc b/target/loongarch/insn_trans/trans_atomic.c.inc
> index 6763c1c301..24fea558d6 100644
> --- a/target/loongarch/insn_trans/trans_atomic.c.inc
> +++ b/target/loongarch/insn_trans/trans_atomic.c.inc
> @@ -12,8 +12,8 @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
>       tcg_gen_addi_tl(t0, src1, a->imm);
>       tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
>       tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
> +    gen_set_gpr(a->rd, dest, EXT_SIGN);
>       tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
> -    gen_set_gpr(a->rd, dest, EXT_NONE);
>       tcg_temp_free(t0);
>   
>       return true;
gaosong Feb. 3, 2023, 7:42 a.m. UTC | #2
在 2023/2/2 下午1:51, Richard Henderson 写道:
> On 2/1/23 17:16, Song Gao wrote:
>> The Manual 2.2.7.2:
>>      'The LL.{W/D} instruction retrieves a word/double-word data from
>>      the specified address of the memory and writes it to the general
>>      register rd after sign extension.'
>>
>> Signed-off-by: Song Gao <gaosong@loongson.cn>
>> ---
>>   target/loongarch/insn_trans/trans_atomic.c.inc | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> The sign-extension is provided by
>
> TRANS(ll_w, gen_ll, MO_TESL)
>                     ^^^^^^^
> this.
>
> So what's the issue?
>
Sorry for the late reply.
It's our other code problem,  you can ignore this patch :-)

Thanks
Song Gao
> r~
>
>>
>> diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc 
>> b/target/loongarch/insn_trans/trans_atomic.c.inc
>> index 6763c1c301..24fea558d6 100644
>> --- a/target/loongarch/insn_trans/trans_atomic.c.inc
>> +++ b/target/loongarch/insn_trans/trans_atomic.c.inc
>> @@ -12,8 +12,8 @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, 
>> MemOp mop)
>>       tcg_gen_addi_tl(t0, src1, a->imm);
>>       tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
>>       tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
>> +    gen_set_gpr(a->rd, dest, EXT_SIGN);
>>       tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
>> -    gen_set_gpr(a->rd, dest, EXT_NONE);
>>       tcg_temp_free(t0);
>>         return true;
diff mbox series

Patch

diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc b/target/loongarch/insn_trans/trans_atomic.c.inc
index 6763c1c301..24fea558d6 100644
--- a/target/loongarch/insn_trans/trans_atomic.c.inc
+++ b/target/loongarch/insn_trans/trans_atomic.c.inc
@@ -12,8 +12,8 @@  static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
     tcg_gen_addi_tl(t0, src1, a->imm);
     tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
     tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
+    gen_set_gpr(a->rd, dest, EXT_SIGN);
     tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
-    gen_set_gpr(a->rd, dest, EXT_NONE);
     tcg_temp_free(t0);
 
     return true;