跳转至

寄存器与存储空间

X 寄存器

公开汇编语法使用 X0X31。X 寄存器既承载普通 64 位标量,也承载地址、stride、repeat、shape 和其他打包控制值。

寄存器 常见用途
X0X28 参数、地址和中间值
X29 生成代码中的帧指针
X30 生成代码中的栈指针
X31 链接寄存器,供 RET 使用

不要在内联汇编中硬编码参数寄存器;使用 %0%1 等占位符让寄存器分配器选择。

MASK 与比较状态

  • MASK[0]MASK[1]:向量执行掩码的两个 64 位半部。
  • MASK:Vector 指令中的组合掩码操作数。
  • CMPMASK0/1:向量比较结果相关的特殊寄存器。
  • Scalar CMP 更新标量条件状态;Vector VCMP 更新向量比较状态,二者不能混用。

已确认的掩码移动:

MOVEMASK MASK[0], X3
MOVEMASK MASK[1], X3

VA 寄存器

VA/VA<n> 表示 Vector Address 描述,用于 gather、scatter、transpose 和部分重排指令。VA 不是普通 X 寄存器,也不是 C 指针;专用指令可能要求多个 VA 槽及专用索引格式。

SPR

特殊寄存器以名称访问,但每个名称允许的方向和目标 CPU 并不相同:

MOV X0, STATUS
MOV X0, CTRL
MOV CTRL, X0

不能使用通用的 SPR[n] 语法。编码号只标识寄存器,不代表寄存器的运行时内容。完整列表见 SPR 编码

配置状态还分为命名 SPR、普通 X 寄存器承载的打包配置字,以及 MASK 等专用状态。读写权限、目标限制、builtin 和内联汇编示例见 配置寄存器与隐式状态

存储层次

C address space 汇编名称 主要用途
1 GM / OUT 全局输入输出内存
2 CBUF / L1 Cube 输入缓存和片上中间层
3 L0A Cube A 操作数
4 L0B Cube B 操作数
5 L0C Cube 累加和结果
6 UB Vector 主要数据存储

Ascend C 中可以用 address-space 类型表达指针:

typedef void __attribute__((address_space(1))) *gmptr;
typedef short __attribute__((address_space(6))) *ubptr;

方括号只表示该寄存器提供地址:

VADD.s16 [X0], [X1], [X2], X3, MASK
MOV_OUT_TO_UB [X4], [X5], X6

它不是 x86 风格的基址+比例索引表达式。地址单位、对齐、边界和 stride 仍由具体指令及其配置参数决定。各执行域的硬检查、拆包粒度和 Bank 映射见地址与数据对齐

常见数据路径

GM/OUT -> UB -> Vector -> UB -> GM/OUT
GM/OUT -> L1 -> L0A/L0B -> Cube -> L0C -> GM/UB

OUT 是工具链对全局端数据流的命名,不意味着存在一种独立于 GM 指针的普通 C 类型。