【发布时间】:2020-03-07 17:55:51
【问题描述】:
我正在尝试使用以下代码在软件中模拟 16 位半浮点数:
typedef struct half
{
unsigned short mantissa:10;
unsigned short exponent:5;
unsigned short sign:1;
} half;
unsigned short from_half(half h)
{
return h.mantissa | h.exponent << 10 | h.sign << 15;
}
half to_half(unsigned short s)
{
half result = { s, s >> 10, s >> 15 };
return result;
}
我对此进行了设置,以便可以轻松地将其优化为移动指令,但是你瞧,在 from_half 中,GCC 无论如何都会进行位移(即使在 -O3 处):
from_half:
mov edx, edi
mov eax, edi
and di, 1023
shr dx, 15
and eax, 31744
movzx edx, dl
sal edx, 15
or eax, edx
or eax, edi
ret
虽然to_half 优化得很好:
to_half:
mov eax, edi
ret
我尝试了不同的优化级别(-O1、-O2、-Os),但没有一个优化到我希望的水平。
即使在-O1,Clang 也会按照我的预期:
from_half: # @from_half
mov eax, edi
ret
to_half: # @to_half
mov eax, edi
ret
我怎样才能让 GCC 把它优化成一个动作?为什么还没有这样优化?
【问题讨论】:
-
即使对于 to_half,优化在 gcc 中也发生得很晚。您可以在 gcc 的 bugzilla 中查找与位域相关的错误。
-
@MarcGlisse 看了看,没有一个开放的相似。
-
请打开一个然后...
-
@MarcGlisse gcc.gnu.org/bugzilla/show_bug.cgi?id=94086
-
需要注意的一点:“位”字段没有定义的顺序。例如,该单符号位可能是位 0 或可能是位 15。实际顺序取决于实现
标签: c gcc compiler-optimization bit-fields