汇编代码格式¶
最小汇编文件¶
.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 机器指令。
基本词法¶
- 助记符通常使用大写,例如
ADD、VADD、MMAD。 - 数据类型写在点号后,例如
.s64、.f32、.s16、.f162f32。 - 立即数以
#开头,例如#0、#257。 - 地址或片上缓冲操作数使用方括号,例如
[X0]。 //可用于行注释。- 标签以标识符和冒号定义;跳转偏移和重定位交给汇编器处理。
- 指令按 4 字节对齐,每条指令生成一个 32 位机器字。
小端机器码¶
机器字写作 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 验证。