ARM Neon 编程(二) 访存指令详解
VLDn
根据 list 参数的不同可以将 VLDn 分为一下三种
- single n - element to one lang
读取一个 n - element 结构体到寄存器的单个通道中 - single n - element to all lang
读取 n - element 结构体到寄存器的所有通道中 - multiple n - element structures
读取 n - element 结构体到寄存器。n 指定分选模式
语法格式
1 | VLDn{cond}.datatype list, [Rn{@aligin}]{!} |
- n
必须在 {1, 2, 3, 4} - cond
可选的状态码 - datatype
单个元素的 bits 数,通常为 8, 16, 32 - list
包括在 {} 中的高级 SIMD 寄存器列表 - Rn
通用寄存器,包含基地址,Rn 不能为 PC - align
指定可选的对齐,通常为 16 的倍数。 - !
如果存在,那么 Rn 寄存器将在操作后更新(Rn + 指令读取的字节数) - Rm
通用寄存器,包含从基地址的偏移量,如果 Rm 存在,当指令访问内存结束后,Rn 更新(Rn=Rn + Rm), Rm 不能为 PC 或 SP。
list 参数
- 读取一个结构,单通道
- {Dd[x], D(d+1){x}}
- {Dd[x], D(d+2){x}, D(d+4){x}}
- 读取一个结构,全通道
- {Dd[], D(d+1)[]}
- {Dd[], D(d+2)[],D(d+4)[]}
- 读取多个结构,支持通道分选
由 n, datatype 共同决定通道分选模式- {Dd, D(d+1)}
- {Dd, D(d+2)}
VLDM
语法格式
1 | VLDMmode{cond} Rn{!} Registers |
- mode
- IA
表示每次传输完成后地址向高地址增长。默认模式并且可以忽略 - DB
表示每次传输完成后地址向低地址增长。 - EA
Empty Ascending Operation.(这什么意思), 在传输时与 DB 相同。 - FD
Full Descending Stack Operation. 在传输时与 IA 相同。
- IA
- cond
可选的条件码。 - Rn
保存传输时基地址的通用寄存器 - !
可选。表示基地址更新后必须写会 Rn, 如果没有 ! 选项,那么模式必须是 IA 模式 - Registers
在 {} 中的寄存器列表。D 寄存器和 Q 寄存器不能混用。不能超过 16 个 D 寄存器或者 8 个 Q 寄存器。
VSTn
语法格式
1 | VSTn{cond}.datatype list [Rn{@align}] {!} |
- n
必须在 {1, 2, 3, 4} 中 - cond
可选的条件码 - datatype
8, 16, 32, 64 - list
在 {} 中的高级 SIMD 寄存器列表。 - Rn
保存基地址的通用寄存器,不能是 PC - align
可选,表示指针对齐 - !
可选,Rn 将在存储生效后更新。(Rn + 指令传输的内存数) - Rm
通用寄存器,保存从基地址开始的偏移量。Rn 将在访存生效后更新(Rn = Rn + Rm). Rm 不能使 SP 或者 PC
list 参数的不同格式对 VST 效果同 VLD
VSTR
扩展寄存器存储(extension register store)
1 | VSTR{cond}{.64} Dd, [Rn [, #offset]] |
- cond
可选的条件码 - Dd
要保存的扩展寄存器 - Rn
保存访存目的地址的通用寄存器 - offset
可选的数学表达式。满足以下条件- 必须在 assembly 时期就可以求值
- 必须是 4 的倍数
- 在 [-1020, 1020] 中间
在传输时基地址会加上该偏移量
VSTR 指令用于向内存保存扩展寄存器的内容
一次传输两字。