可以在ldrex之前将ldr重新排序到同一地址吗?

时间:2014-10-19 02:15:19

标签: assembly arm shared-memory atomic cpu-architecture

在以下指令序列中:

mov r4, r0
add r0, r4, #40
.tryagain:
ldrex   r1, [r0]
add r1, r1, #1
strex   r2, r1, [r0]
cmp r2, #0
bne .tryagain
ldr r1, [r4, #40]

我们首先将[r4 + 40]处的值原子递增1. ldrex将旧值保留在r1中。 然后我们使用正常负载(ldr)立即在同一地址加载新的递增值。 忽略一个明显的事实,即我们可以在bne之后将r1加1,而不是再次加载它,是否有可能处理器重新排序ldr才能在ldrex之前发生?

1 个答案:

答案 0 :(得分:0)

这是来自ARM的Barrier Litmus Tests and Cookbook

  

7.1 LOAD EXCLUSIVE / STORE EXCLUSIVE AND BARRIERS,简介

     

... 说明书   没有任何隐含的屏障功能被定义为他们的一部分   运营 ......