gpt4 book ai didi

c - 我怎样才能让 GCC 将这个位移指令优化为一个 Action ?

转载 作者:行者123 更新时间:2023-12-03 14:00:24 26 4
gpt4 key购买 nike

我正在尝试使用以下代码在软件中模拟 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

Godbolt

我尝试了不同的优化级别( -O1-O2-Os )但没有一个优化到我希望的。

即使在 -O1,Clang 也是如此。 :
from_half:                              # @from_half
mov eax, edi
ret
to_half: # @to_half
mov eax, edi
ret

Godbolt

我怎样才能让 GCC 把它优化成一个 Action ?为什么它没有以这种方式进行优化?

最佳答案

除了Booboo's answer ,您可以尝试以下方法来回答您的问题

How can I get GCC to optimize this into a move?



只需将每个移位的位域表达式转换为 unsigned short
unsigned short from_half(half h)
{
return (unsigned short)h.mantissa | (unsigned short)(h.exponent << 10) | (unsigned short)(h.sign << 15);
}

https://godbolt.org/z/CfZSgC

结果是:
from_half:
mov eax, edi
ret

Why isn't it optimized that way already?



我不确定我对此有一个可靠的答案。显然位域的中间提升到 int混淆优化器......但这只是一个猜测。

关于c - 我怎样才能让 GCC 将这个位移指令优化为一个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60580591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com