跳到主要内容

每周一龙:第 15 期

· 阅读需 6 分钟
WANG Xuerui
🐲龙门客栈打杂的

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯!

如无特别说明,文中提及的日期、时间都为北京时间(UTC+8)。

先「马」再看

本栏目的内容具有一定延续性,将持续追踪报道 LoongArch 领域的重要或长期项目(坑)。

Linux

北京时间 9 月 11 日清晨,Linus tagged Linux 6.6-rc1。 值得一提的是:Linus 在拉取、审查、合并本次的龙架构 PR 时, 对其中的 KASAN 技术细节亲自给出了指导: 指出了其中沿用的一种老式代码写法之不妥,当代一般如何写; 以及两处内联声明的背后原因(这原因在龙架构上无论是否确实存在,都意味着要改代码)。 截至发稿时,Huacai Chen 已经把重构提交贴出来了。

在此之外,Bibo Mao 在继续着他对龙架构内存管理代码的优化: 补丁一补丁二

工具链

gcc

9 月 8 日,GCC 14 最新开发版本被发现在编译 Mesa 时崩溃。 问题原因已找到,补丁贴出来了,等待合并。

所以问题在哪?

LoongArch v1.00 手册提到了 LA64 的 32 位除法、取模操作有坑(中文版卷一 2.2.1.13 节;英文版中没有注明该坑):

「在 LoongArch64 位兼容的机器上,执行 DIV.W[U]MOD.W[U] 指令时, 如果通用寄存器 rj 和 rk 中的数值超过了 32 位有符号数的数值范围, 则指令执行结果可以为无意义的任意值。」

这是一处 LA464 的实现细节暴露,因为其他 32 位操作都简单无视寄存器的高 32 位部分。 鉴于此,所有产生龙架构机器语言的编译器都必须做相应的特殊适配,以确保这些指令的源操作数都符合约束; 不巧 gcc 里这个变换写错了。

此外,评论区中 Lulu Cheng 透露,此乘除法操作的语义大坑已在 LA664 解决了。 笔者也在手上的 3A6000 机器证实了此事。 待多年之后,采用旧语义的处理器型号都淡出市场,就可以叫大家都停止生成这些多余的符号扩展操作了。

同一天,guojie 为龙架构上 -O1 及更高的优化级别都默认开启了 -fsched-pressure 优化工序。

9 月 7 日,Xi Ruoyao 使用向量访存指令优化了开启向量支持条件下的内联内存搬运操作。

9 月 6 日,Xi Ruoyao 用伟大的 bstrins 指令优化了位域清空、位域替换操作。 这解决了上游 bug PR111252:比如 __builtin_copysignf128(近期添加的 128 位浮点类型支持的相关基本操作之一)编译结果十分恶劣的问题。

9 月 4 日,Yang Yujie 向 GCC 的 Ada 语言实现添加了 初步的 Linux/LoongArch 适配。

LLVM

9 月 8 日,Nathan Chancellor 在日常的 ClangBuiltLinux 测试中,发现 Clang 在龙架构上使用的 mcount 符号名称有误,顺手帮忙修复了。 (这似乎也是 LLVM 代码审查工作整体转向 GitHub 之后的第一个龙架构相关 PR。)

Rust

9 月 7 日,将 LA64 裸机编译目标们提升至 Tier 2 支持级别的 MCP 进入了公示期,公示期 10 天。 (这个提案是 8 月 15 号发出来的,这么久都没有反对意见,大概率之后也不会有了。9 月 17 号应该会自动通过。)

社区整活

本栏目接受任何网友的投稿,只要内容与 LoongArch 有关,并可以为读者带来价值, 无论严肃贡献(整的大活)或是博君一笑都一概欢迎!

(补充报道)9 月 3 日,Jiajie Chen 在 fuzz 他手头的龙架构 CPU 时,找出了未见于公开文档的几条指令:

  • 操作 8 位和 16 位的 amswapamadd 补充(文档中所有的原子操作扩展指令,最小数据单位都是 32 位),以及
  • 类似 ldx 但无视 rk 槽位的载入操作,这使得 rk 槽位的内容像是给内存子系统的什么提示。

目前暂未检查这些指令是 LA464 还是 LA664 的,但它们显然已经成为了重点关注对象 😼

张贴栏

本栏目可供张贴公益性质的各种信息。