“定制内在”可以使用x64而不是内联汇编功能吗?
我目前正在尝试为我的图书馆创建高度优化,可重复使用的功能。例如,我通过以下方式编写函数“is power of 2”:
template<class IntType>
inline bool is_power_of_two( const IntType x )
{
return (x != 0) && ((x & (x - 1)) == 0);
}
这是一个可移植,低维护的实现,作为内联C ++模板。此代码由VC ++ 2008编译为具有分支的以下代码:
is_power_of_two PROC
test rcx, rcx
je SHORT $LN3@is_power_o
lea rax, QWORD PTR [rcx-1]
test rax, rcx
jne SHORT $LN3@is_power_o
mov al, 1
ret 0
$LN3@is_power_o:
xor al, al
ret 0
is_power_of_two ENDP
我从这里找到了实现:“bit twiddler”,它将在x64的程序集中编码,如下所示:
is_power_of_two_fast PROC
test rcx, rcx
je SHORT NotAPowerOfTwo
lea rax, [rcx-1]
and rax, rcx
neg rax
sbb rax, rax
inc rax
ret
NotAPowerOfTwo:
xor rax, rax
ret
is_power_of_two_fast ENDP
我测试了在汇编模块(.asm文件)中与C ++分开编写的两个子例程,第二个工作速度提高了约20%!
然而,函数调用的开销是相当大的:如果我将第二个程序集实现“is_power_of_two_fast”与模板函数的内联版本进行比较,后者尽管分支更快!
不幸的是,x64的新约定指定不允许内联汇编。应该使用“内在功能”。
现在问题是:我可以将更快的版本“is_power_of_two_fast”实现为自定义内部函数或类似的东西,以便它可以内联使用吗?或者,是否有可能以某种方式强制编译器生成函数的低分支版本?
没有找到相关结果
已邀请:
4 个回复
悍蕾驮苇袜
编译如下
夏瓤跋棘
抽法
在上面的代码中,我没有检查签名类型的数字是否为负数。再次,一个简单的掩码将通过向右(numBit-1)次执行算术移位来获得该技巧,以获得负数的(~0)值和正数的0。
翱抹村