跳转至

汇编代码格式

最小汇编文件

    .text
    .a64
    .globl vector_add
    .type vector_add,@function
vector_add:
    VADD.s16 [X0], [X1], [X2], X3, MASK
    RET
    .size vector_add, .-vector_add

.text.globl.type.size 是 ELF 汇编指令;.a64 选择 HiIPU 64 位汇编模式。它们不是 NPU 机器指令。

基本词法

  • 助记符通常使用大写,例如 ADDVADDMMAD
  • 数据类型写在点号后,例如 .s64.f32.s16.f162f32
  • 立即数以 # 开头,例如 #0#257
  • 地址或片上缓冲操作数使用方括号,例如 [X0]
  • // 可用于行注释。
  • 标签以标识符和冒号定义;跳转偏移和重定位交给汇编器处理。
  • 指令按 4 字节对齐,每条指令生成一个 32 位机器字。

小端机器码

VADD.s16 [X0], [X1], [X2], X3, MASK
// encoding: [0x0c,0x11,0x80,0x85]

机器字写作 0x8580110c,文件中的字节顺序为 0c 11 80 85

常见寄存器字段

许多 Vector、Cube 和 MTE 格式复用四个 5 位 X 寄存器槽:

位段 通用名称 常见角色
[21:17] Xd 目标值或目标地址
[16:12] Xn 第一源值或源地址
[11:7] Xm 第二源、索引或搬运参数
[6:2] Xs 配置、形状或第四操作数

这只是常见骨架。Scalar 立即数、控制流、特殊 Vector 和压缩/图像指令会重新解释部分位段。

六类编码骨架

Scalar:  000 | op1 | dtype | Xd | Xn | Xm | subop/imm
Flow:    010 | class/condition | target/register/event
MTE:     011 | type | op1 | Xd | Xn | Xm | mode
Vector:  100 | op1 | dtype/op2 | Xd | Xn | Xm | Xs | subop
Fixpipe: 110 | operation-specific payload
Cube:    111 | mode/name | dtype | Xd | Xn | Xm | Xs | mode

具体指令的格式、参数和掩码见 操作数与格式类 以及各指令族页面。

数据类型后缀

类别 常见后缀 含义示例
整数 .s8/.s16/.s32/.s64 有符号整数位宽
无符号整数 .u8/.u16/.u32/.u64 无符号整数位宽
位串 .b8/.b16/.b32/.b64 不解释符号的位宽操作
浮点 .f16/.f32 FP16/FP32
转换 .f162f32.s322f32 源类型到目标类型
比较 .EQ/.NE/.LT/.LE/.GT/.GE 条件谓词

同一个后缀是否可用取决于助记符和目标 CPU。应先查看指令页的语法状态,再交给 -cc1as 验证。