我正在使用 gcc 为 32 位处理器编译 C 代码。它适用于-O0
优化,但是-O1
(也尝试过-Ofast
)它会产生不正确的输出。
void foo()
{
volatile unsigned int *reg = (volatile unsigned int *)0x1000;
unsigned int reg_value;
unsigned int busy;
do {
reg_value = *reg;
busy = (reg_value & 0x80000000U);
} while (busy == 0);
}
Run Code Online (Sandbox Code Playgroud)
随着-O1
编译器产生:
1030cea6 <foo>:
1030cea6: a1 00 10 00 00 mov 0x1000,%eax
1030ceab: 85 c0 test %eax,%eax
1030cead: 79 f7 jns 1030cea6 <foo>
1030ceaf: c3 ret
Run Code Online (Sandbox Code Playgroud)
此输出的问题是 'test %eax,%eax' 检查所有 32 位,而不仅仅是位 …