有问题的代码:
浮点低16位 AsFloat_Incorrect (uint32_t a)
{
const uint32_t lo16 = A & 0x0000FFFFU;
return _itof (lo16);
}
浮点低16位 AsFloat_Correct (uint32_t A)
{
返回_itof (A & 0x0000FFFFU);
}
我们希望这两个函数能够生成功能相同的目标代码。
使用以下标志调用编译器: -mv6600 -c++14 -O3 -DNDEBUG -auto_inline=0 -MS1
为第一个函数产生错误的输出。 请注意 lower16BitAsFloate_incorrect 中缺少的 EXTU 指令:
lower16BitAsFloate_incorrect (unsigned int):
RETNOP B3,5. ;[]|14|
lower16BitAsFloate_Correct (unsigned int):
RETNOP B3,4. ;[]|26|
EXTU .S1 A4,16,16,A4 ;[A_S66]|25|
尝试缩小触发条件范围时、我们发现以下代码会生成正确的二进制文件。
因此、我们怀疑问题与16位 处理相关/仅限于16位处理、并且由于 FP 次正常模式而未触发。
浮点值17位 AsFloat_Correct (uint32_t a)
{
const uint32_t lo17 = A & 0x0001FFFFU;
return _itof (lo17);
}
浮点低值15BitAsFloat_Correct (uint32_t A)
{
const uint32_t lo15 = A & 0x00007FFFU;
return _itof (lo15);
}
产生:
lower17BitAsFloate_Correct (unsigned int):
RETNOP B3,4. ;[]|8|
EXTU .S1 A4,15,15,A4 ;[A_S66]|7|
lower15BitAsFloate_Correct (unsigned int):
RETNOP B3,4. ;[]|20|
EXTU .S1 A4,17,17,A4 ;[A_S66]|19|