至于今天,我使用了自己的min()
函数(float
和int
)
这基于if但是今天我知道x86有一些操作数
最小 - 这是
MINSS - 操作数最小值
我认为如果基于min()
例程是有效的
我非常小心优化,所以我想改写自己的
常规进入minss
版本并带有一些内联汇编,
我想找到最有效的版本 gcc内联汇编看起来像
我需要像
这样的东西int min(int a, int b)
{
// minss a, b
//return
}
适用于int
和float
,使用minss
操作码,并且具有最少的序幕和
结语
或者只是使用库版本会更快?虽然我想 不使用库min / max并尽可能快地使用它
答案 0 :(得分:5)
以下是min
和int
的{{1}}最有效的实施方式:
float
“但是,”你惊叹道,“那些人会有条件地跳跃!”不。这是int
min_int(int a, int b)
{
return a < b ? a : b;
}
float
min_float(float a, float b)
{
return a < b ? a : b;
}
:
gcc -S -O2
对于min_int:
cmpl %edi, %esi
movl %edi, %eax
cmovle %esi, %eax
ret
min_float:
minss %xmm1, %xmm0
ret
,你得到一个有条件的移动,对于int
你得到float
,因为编译器非常聪明。不需要内联ASM!
编辑:如果你仍然对如何使用内联汇编感到好奇,这里有一个例子(对于gcc):
minss
float
min_float_asm(float a, float b)
{
float result = a;
asm ("minss %1, %0" : "+x" (result) : "x" (b));
return result;
}
约束表示“任何SSE寄存器”,x
表示将读取和写入值,而"+x"
表示只读。
答案 1 :(得分:1)
好吧,我建议反对这种微优化。无论如何你想要这样做,GCC有一些__builtin_*
功能。一个是v4sf __builtin_ia32_minss (v4sf, v4sf)
。还有其他min*
内置插件,请查看文档。
为了获得更多可移植性,您可能需要查看Intel Intrinsics Guide。这些功能通常也由GCC和Clang支持。