From: Jiajie Chen <c@jia.je>
To: gaosong <gaosong@loongson.cn>,
Richard Henderson <richard.henderson@linaro.org>,
qemu-devel@nongnu.org
Cc: git@xen0n.name, bibo mao <maobibo@loongson.cn>
Subject: Re: [PATCH 0/5] Add LoongArch v1.1 instructions
Date: Tue, 11 Nov 2025 00:00:43 +0800 [thread overview]
Message-ID: <c70df121-ed67-403c-ab5c-c541b9eed38b@jia.je> (raw)
In-Reply-To: <aa59dc19-d01a-e160-38fa-928881fa2ee3@loongson.cn>
[-- Attachment #1: Type: text/plain, Size: 7799 bytes --]
Reply below.
On 2025/11/10 11:42, gaosong wrote:
> 在 2023/10/31 下午7:10, Jiajie Chen 写道:
>>
>> On 2023/10/31 19:06, gaosong wrote:
>>> 在 2023/10/31 下午5:13, Jiajie Chen 写道:
>>>>
>>>> On 2023/10/31 17:11, gaosong wrote:
>>>>> 在 2023/10/30 下午7:54, Jiajie Chen 写道:
>>>>>>
>>>>>> On 2023/10/30 16:23, gaosong wrote:
>>>>>>> 在 2023/10/28 下午9:09, Jiajie Chen 写道:
>>>>>>>>
>>>>>>>> On 2023/10/26 14:54, gaosong wrote:
>>>>>>>>> 在 2023/10/26 上午9:38, Jiajie Chen 写道:
>>>>>>>>>>
>>>>>>>>>> On 2023/10/26 03:04, Richard Henderson wrote:
>>>>>>>>>>> On 10/25/23 10:13, Jiajie Chen wrote:
>>>>>>>>>>>>> On 2023/10/24 07:26, Richard Henderson wrote:
>>>>>>>>>>>>>> See target/arm/tcg/translate-a64.c, gen_store_exclusive,
>>>>>>>>>>>>>> TCGv_i128 block.
>>>>>>>>>>>>>> See target/ppc/translate.c, gen_stqcx_.
>>>>>>>>>>>>>
>>>>>>>>>>>>> The situation here is slightly different: aarch64 and
>>>>>>>>>>>>> ppc64 have both 128-bit ll and sc, however LoongArch v1.1
>>>>>>>>>>>>> only has 64-bit ll and 128-bit sc.
>>>>>>>>>>>
>>>>>>>>>>> Ah, that does complicate things.
>>>>>>>>>>>
>>>>>>>>>>>> Possibly use the combination of ll.d and ld.d:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ll.d lo, base, 0
>>>>>>>>>>>> ld.d hi, base, 4
>>>>>>>>>>>>
>>>>>>>>>>>> # do some computation
>>>>>>>>>>>>
>>>>>>>>>>>> sc.q lo, hi, base
>>>>>>>>>>>>
>>>>>>>>>>>> # try again if sc failed
>>>>>>>>>>>>
>>>>>>>>>>>> Then a possible implementation of gen_ll() would be: align
>>>>>>>>>>>> base to 128-bit boundary, read 128-bit from memory, save
>>>>>>>>>>>> 64-bit part to rd and record whole 128-bit data in llval.
>>>>>>>>>>>> Then, in gen_sc_q(), it uses a 128-bit cmpxchg.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> But what about the reversed instruction pattern: ll.d hi,
>>>>>>>>>>>> base, 4; ld.d lo, base 0?
>>>>>>>>>>>
>>>>>>>>>>> It would be worth asking your hardware engineers about the
>>>>>>>>>>> bounds of legal behaviour. Ideally there would be some very
>>>>>>>>>>> explicit language, similar to
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I'm a community developer not affiliated with Loongson. Song
>>>>>>>>>> Gao, could you provide some detail from Loongson Inc.?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ll.d r1, base, 0
>>>>>>>>> dbar 0x700 ==> see 2.2.8.1
>>>>>>>>> ld.d r2, base, 8
>>>>>>>>> ...
>>>>>>>>> sc.q r1, r2, base
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks! I think we may need to detect the ll.d-dbar-ld.d
>>>>>>>> sequence and translate the sequence into one
>>>>>>>> tcg_gen_qemu_ld_i128 and split the result into two 64-bit
>>>>>>>> parts. Can do this in QEMU?
>>>>>>>>
>>>>>>>>
>>>>>>> Oh, I'm not sure.
>>>>>>>
>>>>>>> I think we just need to implement sc.q. We don't need to care
>>>>>>> about 'll.d-dbar-ld.d'. It's just like 'll.q'.
>>>>>>> It needs the user to ensure that .
>>>>>>>
>>>>>>> ll.q' is
>>>>>>> 1) ll.d r1 base, 0 ==> set LLbit, load the low 64 bits into r1
>>>>>>> 2) dbar 0x700
>>>>>>> 3) ld.d r2 base, 8 ==> load the high 64 bits to r2
>>>>>>>
>>>>>>> sc.q needs to
>>>>>>> 1) Use 64-bit cmpxchg.
>>>>>>> 2) Write 128 bits to memory.
>>>>>>
>>>>>> Consider the following code:
>>>>>>
>>>>>>
>>>>>> ll.d r1, base, 0
>>>>>>
>>>>>> dbar 0x700
>>>>>>
>>>>>> ld.d r2, base, 8
>>>>>>
>>>>>> addi.d r2, r2, 1
>>>>>>
>>>>>> sc.q r1, r2, base
>>>>>>
>>>>>>
>>>>>> We translate them into native code:
>>>>>>
>>>>>>
>>>>>> ld.d r1, base, 0
>>>>>>
>>>>>> mv LLbit, 1
>>>>>>
>>>>>> mv LLaddr, base
>>>>>>
>>>>>> mv LLval, r1
>>>>>>
>>>>>> dbar 0x700
>>>>>>
>>>>>> ld.d r2, base, 8
>>>>>>
>>>>>> addi.d r2, r2, 1
>>>>>>
>>>>>> if (LLbit == 1 && LLaddr == base) {
>>>>>>
>>>>>> cmpxchg addr=base compare=LLval new=r1
>>>>>>
>>>>>> 128-bit write {r2, r1} to base if cmpxchg succeeded
>>>>>>
>>>>>> }
>>>>>>
>>>>>> set r1 if sc.q succeeded
>>>>>>
>>>>>>
>>>>>>
>>>>>> If the memory content of base+8 has changed between ld.d r2 and
>>>>>> addi.d r2, the atomicity is not guaranteed, i.e. only the high
>>>>>> part has changed, the low part hasn't.
>>>>>>
>>>>>>
>>>>> Sorry, my mistake. need use cmpxchg_i128. See
>>>>> target/arm/tcg/translate-a64.c gen_store_exclusive().
>>>>>
>>>>> gen_scq(rd, rk, rj)
>>>>> {
>>>>> ...
>>>>> TCGv_i128 t16 = tcg_temp_new_i128();
>>>>> TCGv_i128 c16 = tcg_temp_new_i128();
>>>>> TCGv_i64 low = tcg_temp_new_i64();
>>>>> TCGv_i64 high= tcg_temp_new_i64();
>>>>> TCGv_i64 temp = tcg_temp_new_i64();
>>>>>
>>>>> tcg_gen_concat_i64_i128(t16, cpu_gpr[rd], cpu_gpr[rk]));
>>>>>
>>>>> tcg_gen_qemu_ld(low, cpu_lladdr, ctx->mem_idx, MO_TEUQ);
>>>>> tcg_gen_addi_tl(temp, cpu_lladdr, 8);
>>>>> tcg_gen_mb(TCG_BAR_SC | TCG_MO_LD_LD);
>>>>> tcg_gen_qemu_ld(high, temp, ctx->mem_idx, MO_TEUQ);
>>>>
>>>>
>>>> The problem is that, the high value read here might not equal to
>>>> the previously read one in ll.d r2, base 8 instruction.
>>> I think dbar 0x7000 ensures that the 2 loads in 'll.q' are a 128bit
>>> atomic operation.
>>
>>
>> The code does work in real LoongArch machine. However, we are
>> emulating LoongArch in qemu, we have to make it atomic, yet it isn't
>> now.
>>
>>
> Hi, jiajie
>
> Could you help refresh this series ?
>
> Thanks.
> Song Gao
I am busy with my research these days, until around mid December. After
that I may try to implement following idea:
https://developer.arm.com/documentation/ddi0487/latest/
B2.9.5 Load-Exclusive and Store-Exclusive instruction usage
restrictions
But you could do the same thing, aligning and recording the entire
128-bit quantity, then extract the ll.d result based on address bit
6. This would complicate the implementation of sc.d as well, but
would perhaps bring us "close enough" to the actual architecture.
Note that our Arm store-exclusive implementation isn't quite in spec
either. There is quite a large comment within translate-a64.c
store_exclusive() about the ways things are not quite right. But it
seems to be close enough for actual usage to succeed.
r~
Best regards,
Jiajie Chen
>>> Thanks.
>>> Song Gao
>>>>> tcg_gen_concat_i64_i128(c16, low, high);
>>>>>
>>>>> tcg_gen_atomic_cmpxchg_i128(t16, cpu_lladdr, c16, t16,
>>>>> ctx->mem_idx, MO_128);
>>>>>
>>>>> ...
>>>>> }
>>>>>
>>>>> I am not sure this is right.
>>>>>
>>>>> I think Richard can give you more suggestions. @Richard
>>>>>
>>>>> Thanks.
>>>>> Song Gao
>>>>>>
>>>>>>> Thanks.
>>>>>>> Song Gao
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> For this series,
>>>>>>>>> I think we need set the new config bits to the 'max cpu', and
>>>>>>>>> change linux-user/target_elf.h ''any' to 'max', so that we can
>>>>>>>>> use these new instructions on linux-user mode.
>>>>>>>>
>>>>>>>> I will work on it.
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> Song Gao
>>>>>>>>>>>
>>>>>>>>>>> https://developer.arm.com/documentation/ddi0487/latest/
>>>>>>>>>>> B2.9.5 Load-Exclusive and Store-Exclusive instruction usage
>>>>>>>>>>> restrictions
>>>>>>>>>>>
>>>>>>>>>>> But you could do the same thing, aligning and recording the
>>>>>>>>>>> entire 128-bit quantity, then extract the ll.d result based
>>>>>>>>>>> on address bit 6. This would complicate the implementation
>>>>>>>>>>> of sc.d as well, but would perhaps bring us "close enough"
>>>>>>>>>>> to the actual architecture.
>>>>>>>>>>>
>>>>>>>>>>> Note that our Arm store-exclusive implementation isn't quite
>>>>>>>>>>> in spec either. There is quite a large comment within
>>>>>>>>>>> translate-a64.c store_exclusive() about the ways things are
>>>>>>>>>>> not quite right. But it seems to be close enough for actual
>>>>>>>>>>> usage to succeed.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> r~
>>>>>>>>>
>>>>>>>
>>>>>
>>>
>
[-- Attachment #2: Type: text/html, Size: 15993 bytes --]
prev parent reply other threads:[~2025-11-10 16:01 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-23 15:29 [PATCH 0/5] Add LoongArch v1.1 instructions Jiajie Chen
2023-10-23 15:29 ` [PATCH 1/5] include/exec/memop.h: Add MO_TESB Jiajie Chen
2023-10-23 15:49 ` David Hildenbrand
2023-10-23 15:52 ` Jiajie Chen
2023-10-23 15:29 ` [PATCH 2/5] target/loongarch: Add am{swap/add}[_db].{b/h} Jiajie Chen
2023-10-23 22:50 ` Richard Henderson
2023-10-23 15:29 ` [PATCH 3/5] target/loongarch: Add amcas[_db].{b/h/w/d} Jiajie Chen
2023-10-23 15:35 ` Jiajie Chen
2023-10-23 23:00 ` Richard Henderson
2023-10-23 22:59 ` Richard Henderson
2023-10-23 15:29 ` [PATCH 4/5] target/loongarch: Add estimated reciprocal instructions Jiajie Chen
2023-10-23 23:02 ` Richard Henderson
2023-10-23 15:29 ` [PATCH 5/5] target/loongarch: Add llacq/screl instructions Jiajie Chen
2023-10-23 23:19 ` Richard Henderson
2023-10-23 23:26 ` [PATCH 0/5] Add LoongArch v1.1 instructions Richard Henderson
2023-10-24 6:10 ` Jiajie Chen
2023-10-25 17:13 ` Jiajie Chen
2023-10-25 19:04 ` Richard Henderson
2023-10-26 1:38 ` Jiajie Chen
2023-10-26 6:54 ` gaosong
2023-10-28 13:09 ` Jiajie Chen
2023-10-30 8:23 ` gaosong
2023-10-30 11:54 ` Jiajie Chen
2023-10-31 9:11 ` gaosong
2023-10-31 9:13 ` Jiajie Chen
2023-10-31 11:06 ` gaosong
2023-10-31 11:10 ` Jiajie Chen
2023-10-31 12:12 ` gaosong
2025-11-10 3:42 ` gaosong
2025-11-10 16:00 ` Jiajie Chen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c70df121-ed67-403c-ab5c-c541b9eed38b@jia.je \
--to=c@jia.je \
--cc=gaosong@loongson.cn \
--cc=git@xen0n.name \
--cc=maobibo@loongson.cn \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).