最小的gcc内联汇编

时间:2014-07-05 15:58:04

标签: gcc assembly x86 sse

至于今天,我使用了自己的min()函数(floatint) 这基于if但是今天我知道x86有一些操作数 最小 - 这是

  

MINSS - 操作数最小值

我认为如果基于min()例程是有效的 我非常小心优化,所以我想改写自己的 常规进入minss版本并带有一些内联汇编,

我想找到最有效的版本 gcc内联汇编看起来像

我需要像

这样的东西
int min(int a, int b)
{
  // minss a, b
   //return 
}

适用于intfloat,使用minss操作码,并且具有最少的序幕和 结语

或者只是使用库版本会更快?虽然我想 不使用库min / max并尽可能快地使用它

2 个答案:

答案 0 :(得分:5)

以下是minint的{​​{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支持。

相关问题