质疑 GCC 生成原子中 PowerPC 障碍的有效性

R..*_*R.. 6 c assembly powerpc atomic

GCC__sync_val_compare_and_swap在 PowerPC[64] 上实现为:

    sync
1:  lwarx 9,0,3
    cmpw 0,9,4
    bne 0,2f
    stwcx. 5,0,3
    bne 0,1b
2:  isync
Run Code Online (Sandbox Code Playgroud)

__sync_*内置函数的GCC 文档:

在大多数情况下,这些内置函数被认为是一个完整的屏障。也就是说,无论是向前还是向后,都不会在整个操作中移动内存操作数。此外,将根据需要发出指令,以防止处理器推测整个操作的负载以及在操作之后将存储排队。

然而,在最后使用isync而不是sync让我感到困扰。这实际上是一个完整的障碍吗?或者:

  1. 是否可以在__sync_val_compare_and_swap未能看到在产生__sync_val_compare_and_swap加载值的存储之前执行的存储之后执行加载?

  2. 是否__sync_val_compare_and_swap可以在其他线程看到__sync_val_compare_and_swap?存储的值之前执行存储?