在C ++中饱和short(int16)

托马斯·库贝斯(Tomas Kubes)

我正在优化瓶颈代码:

int sum = ........
sum = (sum >> _bitShift);

if (sum > 32000)
    sum = 32000; //if we get an overflow, saturate output
else if (sum < -32000)
    sum = -32000; //if we get an underflow, saturate output

short result = static_cast<short>(sum);

我想将饱和条件写为一个“如果条件”,或者甚至更好地写成“如果条件”,以使此代码更快。我不需要精确地将饱和度设置为32000,可以接受任何类似的值,例如32768。

根据此页面,ARM中有一个饱和指令。x86 / x64中有类似的东西吗?

塞尔比

您确定可以在此击败编译器吗?

这是启用最大尺寸优化的x64零售。Visual Studio v15.7.5。

ecx包含此块开始处的初始值。完成后,eax将充满饱和值。

    return (x > 32767) ? 32767 : ((x < -32768) ? -32768 : x);
mov         edx,0FFFF8000h  
movzx       eax,cx  
cmp         ecx,edx  
cmovl       eax,edx  
mov         edx,7FFFh  
cmp         ecx,edx  
movzx       eax,ax  
cmovg       eax,edx 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章