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

Can GCC use read-modify-write instructions to update volatile variables?

本文关键字:易失性 更新 变量 可以使 修改 GCC 指令      更新时间:2023-10-16

假设您有用于x86系统的C代码,如下:

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

GCC可以自由地在这里生成读-修改-写指令吗?如果是这样,在函数中封装对volatile变量的读写操作是否可以确保GCC不会将这些访问合并到单个RMW指令中?

C标准没有指定要使用什么指令。对于这样一个简单的更新,gcc最有可能生成一个样式为

的RMW指令。
orl (%rdx), $1

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

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