每周一龍:第 15 期

作者:WANG Xuerui(https://github.com/xen0n)
原文鏈接:https://areweloongyet.com/newsletter/this-week-in-loongarch-15/
2023年9月11日· 閱讀需 6 分鐘
每周一都為大家報道 LoongArch? 社區(qū)最前線的第一手新鮮資訊!
如無特別說明,文中提及的日期、時間都為北京時間(UTC+8)。

先「馬」再看
本欄目的內(nèi)容具有一定延續(xù)性,將持續(xù)追蹤報道 LoongArch? 領(lǐng)域的重要或長期項(xiàng)目(坑)。
Linux
北京時間 9 月 11 日清晨,Linus taggedLinux 6.6-rc1。 值得一提的是:Linus 在拉取、審查、合并本次的龍架構(gòu) PR 時, 對其中的 KASAN 技術(shù)細(xì)節(jié)親自給出了指導(dǎo): 指出了其中沿用的一種老式代碼寫法之不妥,當(dāng)代一般如何寫; 以及兩處內(nèi)聯(lián)聲明的背后原因(這原因在龍架構(gòu)上無論是否確實(shí)存在,都意味著要改代碼)。 截至發(fā)稿時,Huacai Chen 已經(jīng)把重構(gòu)提交貼出來了。
在此之外,Bibo Mao 在繼續(xù)著他對龍架構(gòu)內(nèi)存管理代碼的優(yōu)化:https://lore.kernel.org/loongarch/20230908012907.2994001-1-maobibo@loongson.cn/、https://lore.kernel.org/loongarch/20230907020936.2692542-1-maobibo@loongson.cn/。
工具鏈
gcc
9 月 8 日,GCC 14 最新開發(fā)版本被發(fā)現(xiàn)在編譯 Mesa 時崩潰。 問題原因已找到,補(bǔ)丁貼出來了,等待合并。
所以問題在哪兒?
LoongArch? v1.00 手冊提到了 LA64 的 32 位除法、取模操作有坑(中文版卷一 2.2.1.13 節(jié);英文版中沒有注明該坑):
「在 LoongArch64 位兼容的機(jī)器上,執(zhí)行
DIV.W[U]
和MOD.W[U]
指令時, 如果通用寄存器 rj 和 rk 中的數(shù)值超過了 32 位有符號數(shù)的數(shù)值范圍, 則指令執(zhí)行結(jié)果可以為無意義的任意值。」這是一處 LA464 的實(shí)現(xiàn)細(xì)節(jié)暴露,因?yàn)槠渌?32 位操作都簡單無視寄存器的高 32 位部分。 鑒于此,所有產(chǎn)生龍架構(gòu)機(jī)器語言的編譯器都必須做相應(yīng)的特殊適配,以確保這些指令的源操作數(shù)都符合約束; 不巧 gcc 里這個變換寫錯了。
此外,評論區(qū)中 Lulu Cheng 透露,此乘除法操作的語義大坑已在 LA664 解決了。 筆者也在手上的 3A6000 機(jī)器證實(shí)了此事。 待多年之后,采用舊語義的處理器型號都淡出市場,就可以叫大家都停止生成這些多余的符號擴(kuò)展操作了。
同一天,guojie 為龍架構(gòu)上 -O1
及更高的優(yōu)化級別都默認(rèn)開啟了-fsched-pressure
優(yōu)化工序。
9 月 7 日,Xi Ruoyao 使用向量訪存指令優(yōu)化了開啟向量支持條件下的內(nèi)聯(lián)內(nèi)存搬運(yùn)操作。
9 月 6 日,Xi Ruoyao 用偉大的 bstrins
指令優(yōu)化了位域清空、位域替換操作。
這解決了上游 bug PR111252:比如__builtin_copysignf128
(近期添加的 128 位浮點(diǎn)類型支持的相關(guān)基本操作之一)編譯結(jié)果十分惡劣的問題。
9 月 4 日,Yang Yujie 向 GCC 的 Ada 語言實(shí)現(xiàn)添加了 初步的 Linux/LoongArch 適配。
LLVM
9 月 8 日,Nathan Chancellor 在日常的 ClangBuiltLinux 測試中,發(fā)現(xiàn) Clang 在龍架構(gòu)上使用的 mcount 符號名稱有誤,順手幫忙修復(fù)了。 (這似乎也是 LLVM 代碼審查工作整體轉(zhuǎn)向 GitHub之后的第一個龍架構(gòu)相關(guān) PR。)
Rust
9 月 7 日,將 LA64 裸機(jī)編譯目標(biāo)們提升至 Tier 2 支持級別的 MCP 進(jìn)入了公示期,公示期 10 天。 (這個提案是 8 月 15 號發(fā)出來的,這么久都沒有反對意見,大概率之后也不會有了。9 月 17 號應(yīng)該會自動通過。)

社區(qū)整活兒
本欄目接受任何網(wǎng)友的投稿,只要內(nèi)容與 LoongArch? 有關(guān),并可以為讀者帶來價值, 無論嚴(yán)肅貢獻(xiàn)(整的大活兒)或是博君一笑都一概歡迎!
(補(bǔ)充報道)9 月 3 日,Jiajie Chen 在 fuzz 他手頭的龍架構(gòu) CPU 時,找出了未見于公開文檔的幾條指令:
操作 8 位和 16 位的
amswap
與amadd
補(bǔ)充(文檔中所有的原子操作擴(kuò)展指令,最小數(shù)據(jù)單位都是 32 位),以及類似
ldx
但無視rk
槽位的載入操作,這使得rk
槽位的內(nèi)容像是給內(nèi)存子系統(tǒng)的什么提示。
目前暫未檢查這些指令是 LA464 還是 LA664 的,但它們顯然已經(jīng)成為了重點(diǎn)關(guān)注對象 ??。

張貼欄
本欄目可供張貼公益性質(zhì)的各種信息。
本周報持續(xù)接受網(wǎng)友投稿。歡迎來上游坐坐!
本文章的內(nèi)容以 CC-BY-NC-SA 4.0 許可證授權(quán)。