Ang*_*sky 7 c++ 64-bit assembly inline-assembly intrinsics
我目前正在尝试为我的图书馆创建高度优化,可重复使用的功能.例如,我通过以下方式编写函数"is power of 2":
template<class IntType>
inline bool is_power_of_two( const IntType x )
{
return (x != 0) && ((x & (x - 1)) == 0);
}
Run Code Online (Sandbox Code Playgroud)
这是一个可移植,低维护的实现,作为内联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
Run Code Online (Sandbox Code Playgroud)
我从这里找到了实现:"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
Run Code Online (Sandbox Code Playgroud)
我测试了在汇编模块(.asm文件)中与C++分开编写的两个子例程,第二个工作速度提高了约20%!
然而,函数调用的开销是相当大的:如果我比较的第二个组件实施"is_power_of_two_fast"的模板函数的inline'd版本,后者尽管树枝更快!
不幸的是,x64的新约定指定不允许内联汇编.应该使用"内在功能".
现在问题是:我可以将更快的版本"is_power_of_two_fast"实现为自定义内部函数或类似的东西,以便它可以内联使用吗?或者,是否有可能以某种方式强制编译器生成函数的低分支版本?
小智 2
甚至 VC 2005 也能够使用 sbb 指令生成代码。
对于 C 代码
bool __declspec(noinline) IsPowOf2(unsigned int a)
{
return (a>=1)&((a&(a-1))<1);
}
Run Code Online (Sandbox Code Playgroud)
编译为以下内容
00401000 lea eax,[ecx-1]
00401003 and eax,ecx
00401005 cmp eax,1
00401008 sbb eax,eax
0040100A neg eax
0040100C cmp ecx,1
0040100F sbb ecx,ecx
00401011 add ecx,1
00401014 and eax,ecx
00401016 ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2169 次 |
| 最近记录: |