飞腾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针对流数据占用的数据高速缓存进行策略优化,例如高速缓存可能没有预读,内存写操作也可能不会合并。

  1. ldnp,类似ldp
  2. stnp,类似stp

3. 独占类型

  1. 读指令会把访问的物理地址标记上独占标记;
  2. 写指令会在执行写操作之前检查独占标记是否完整。如果独占标记被破坏,就不执行写操作,并返回失败标志;如果独占标记完整,执行写操作,并释放独占标志,并返回成功标志。
  1. 独占指令一定是先读后写成对使用。
  2. 写不一定成功,可能会失败。
  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指令等内存屏障指令。

内存屏障读指令

  1. 仅对内存屏障读指令之后的访存指令有约束,要求在内存屏障读指令之后的所有访存指令,必须在内存屏障读指令完成之后才能执行。
  2. 可以简单理解为,普通读指令之紧跟着DMB数据同步指令。

内存屏障写指令

  1. 仅对该指令之前的访存指令有约束,要求在内存屏障写指令之前的所有访存指令,必须在内存屏障写指令执行之前全部完成。
  2. 可以简单理解为,普通写指令之紧挨着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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部