12.3. 指令融合和地址对齐

指令融合是指把多条指令改写为执行效率更高的一条或少量指令,以减少指令数并提升性能。例如:

shl   r3, 3
add.d r2, r2, r3
=>
alsl_d r2, r3, r2, 2

由于龙芯指令集提供移位加指令 alsl,存在数据相关的 shladd 可以合并为一条 alsl 指令完成。

当多线程程序对共享数据访问顺序有要求时,可能需要在写指令 st 前后加入屏障指令 dbar。在这种情况下,改用带屏障语义的原子指令通常更高效,示例如下:

dbar 0
st.w r4, r12, 0
dbar 0
=>
amswap_db.w r0, r4, r12

访存地址应尽量满足自然对齐。访问非对齐地址(load 或 store)可能使处理器消耗更多内存周期,并引入额外处理。即便龙芯处理器已支持硬件自动处理非对齐访存,其成本低于纯软件处理方式,但仍会造成一定性能损失。因此,编写程序时应了解并使用常见的数据对齐方法,例如:

  • 将多字节整数和浮点数放在自然边界上;

  • 优先保证存储地址对齐,再考虑加载地址对齐;

  • 必要时在数据结构中加入填充字段,以满足对齐要求。

在龙芯指令集中,边界检查访存指令、原子访存指令,以及普通访存指令中的 LDX、STX,强制要求访存地址自然对齐;否则会触发非对齐例外。对于其他常用普通访存指令,如 LD.{B/H/W/D}、ST.{B/H/W/D}、LDX.{B/H/W/D}、STX.{B/H/W/D} 等,若硬件实现了非对齐访存,且当前环境配置允许非对齐访问,则指令可以访问非对齐地址。也就是说,地址未自然对齐时,硬件仍会完成访问并返回正确结果。LoongArch 支持由硬件处理非对齐内存数据访问。若要确认当前环境是否允许非对齐访存,可以编写简单测试程序验证,也可以读取控制状态寄存器 MISC 进行判断。