GCC可以使用读 - 修改 - 写指令来更新volatile变量吗?

Jul*_*ina 3 c c++ port x86 gcc

假设您有x86系统代码的C代码,如下所示:

volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;
Run Code Online (Sandbox Code Playgroud)

GCC可以在这里自由生成读 - 修改 - 写指令吗?如果是这样,将封装读取和写入函数中的volatile变量确保GCC不将访问组合到单个RMW指令中?

我知道C规范对此有意模糊.

Ser*_* L. 5

C标准没有规定使用什么指令.对于像这样的简单更新,gcc最有可能生成单个RMW指令的风格

orl (%rdx), $1
Run Code Online (Sandbox Code Playgroud)

volatile关键字与它无关.任何组合load, modify, store都会有效.该volatile关键字只告诉编译器重新加载每次使用的,而不是通过寄存器缓存的优化内存中的价值.

如果你想要一个原子更新然后你需要原子,gcc提供了这个 _sync_fetch_and_or(type *, type)