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

时间:2014-05-22 10:32:10

标签: c++ c gcc x86 port

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

volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;

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

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

1 个答案:

答案 0 :(得分:5)

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

orl (%rdx), $1

volatile关键字与此无关。 load, modify, store的任何组合也都有效。 volatile关键字仅告诉编译器在每次使用时从内存重新加载值,而不是使用寄存器缓存优化。

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