飞腾CPU体系结构(七)
飞腾CPU体系结构(七)——普通访存指令
在AArch64执行模式下,飞腾CPU的Load/Store访存指令采用64位地址。
普通访存指令是指, 内存单元(长度不超过64位)和通用寄存器之间的数据传输,包括:
单寄存器类型
双寄存器类型
独占类型
内存屏障类型
1. 单寄存器类型
指令 传输数据长度 数据传输方向 寄存器高位扩展描述 ldr x1, [x0] 64 从内存到寄存器 无 ldr w1, [x0] 32 从内存到寄存器 寄存器高32位清零 ldrsw x1, [x0] 32 从内存到寄存器 寄存器高32位符号扩展 ldrh w1, [x0] 16 从内存到寄存器 寄存器高48位清零 ldrsh w1, [x0] 16 从内存到寄存器 寄存器高32位清零,中间16位符号扩展 ldrsh x1, [x0] 16 从内存到寄存器 寄存器高48位符号扩展 ldrb w1, [x0] 8 从内存到寄存器 寄存器高56位清零 ldrsb w1, [x0] 8 从内存到寄存器 寄存器高32位清零,中间24位符号扩展 ldrsb x1, [x0] 8 从内存到寄存器 寄存器高56位符号扩展 str x1, [x0] 64 从寄存器到内存 str w1, [x0] 32 从寄存器到内存 strh w1, [x0] 16 从寄存器到内存 strb w1, [x0] 8 从寄存器到内存
2. 双寄存器类型
一般是指两个连续的内存单元和两个通用寄存器之间的数据传输,包括:
2.1 普通双寄存器类型
双寄存器指令 传输数据长度 等价单寄存器指令 寄存器高位扩展描述 ldp x1, x2, [x0] 两个连续的64位 ldr x1, [x0, #0] 无 ldr x2, [x0, #8] ldp w1, w2, [x0] 两个连续的32位 ldr w1, [x0, #0] 寄存器高32位清零 ldr w2, [x0, #4] ldpsw x1, x2, [x0] 两个连续额32位 ldrsw x1, [x0, #0] 寄存器高32位符号扩展 ldrsw w2, [x0, #4] stp x1, x2, [x0] 两个连续的64位 str x1, [x0, #0] strr x2, [x0, #8] stp w1, w2, [x0] 两个连续的32位 str w1, [x0, #0] strr w2, [x0, #4] 2.2面向流数据类型的双寄存器类型
由于流数据的读/计算/写特点,这类数据在写回内存后,一般不会再次被读取,所以CPU针对流数据占用的数据高速缓存进行策略优化,例如高速缓存可能没有预读,内存写操作也可能不会合并。
- ldnp,类似ldp
- stnp,类似stp
3. 独占类型
- 读指令会把访问的物理地址标记上独占标记;
- 写指令会在执行写操作之前检查独占标记是否完整。如果独占标记被破坏,就不执行写操作,并返回失败标志;如果独占标记完整,执行写操作,并释放独占标志,并返回成功标志。
- 独占指令一定是先读后写成对使用。
- 写不一定成功,可能会失败。
- 独占标记类型指令访问的地址要求地址对齐。
| 独占读指令 | 独占写指令 | 传输数据长度 |
|---|---|---|
| ldxp x1, x2, [x0] | stxp x1, x2, [x0] | 128 |
| ldxr x1, [x0] | stxp x1, [x0] | 64 |
| ldxr w1, [x0] | stxr w1, [x0] | 32 |
| ldxrh w1, [x0] | stxrh w1, [x0] | 16 |
| ldxrb w1, [x0] | stxrb w1, [x0] | 8 |
采用独占型读写指令,可以实现对变量进行原子加操作的汇编代码分析
1: ldxr w0,[x2]/从内存进行独占型读变量到寄存器w0/
add w0, w0, w3/寄存器w0增加w3的值/
stxr w1, w0, [x2]/将更新的w0值进行独占型写,成功w1返回0;否则返回1/
cbnz x1, 1b/判断w1,如果不成功跳转到标签1,重新运行/
注意:独占型读写操作之间的指令,不能有其他访存操作。
4. 内存屏障类型
为了提高CPU性能,飞腾CPU采用乱序和指令多发射的弱顺序性访存技术,这样会导致某些代码段执行结果的不确定性;为了避免弱顺序性访存的错误,处理器一般提供了内存屏障等同步指令。内存屏障类型的访存指令主要是保障了飞腾CPU访存的强顺序性,避免直接采用DMB指令等内存屏障指令。
内存屏障读指令
- 仅对内存屏障读指令之后的访存指令有约束,要求在内存屏障读指令之后的所有访存指令,必须在内存屏障读指令完成之后才能执行。
- 可以简单理解为,普通读指令之
后紧跟着DMB数据同步指令。内存屏障写指令
- 仅对该指令之前的访存指令有约束,要求在内存屏障写指令之前的所有访存指令,必须在内存屏障写指令执行之前全部完成。
- 可以简单理解为,普通写指令之
前紧挨着DMB数据同步指令。
| 内存屏障读指令 | 内存屏障写指令 | 数据长度 |
|---|---|---|
| ldar x1, [x0] | stlr, x1, [x0] | 64 |
| ldar w1, [x0] | stlr w1, [x0] | 32 |
| ldarh w1, [x0] | stlrh w1, [x0] | 16 |
| ldarb w1, [x0] | stlrb w1, [x0] | 8 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
