最小的gcc内联汇编

use*_*913 1 x86 assembly gcc sse

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

MINSS - 操作数的最小值

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

我想找到gcc内联汇编中最有效的版本如何

我需要类似的东西

int min(int a, int b)
{
  // minss a, b
   //return 
}
Run Code Online (Sandbox Code Playgroud)

两个intfloat,使用minss操作码和具有最小的序幕和尾声

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

Tav*_*nes 5

这是最有效的可能实施的minintS和floatS:

int
min_int(int a, int b)
{
  return a < b ? a : b;
}

float
min_float(float a, float b)
{
  return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

"但是,"你惊叹道,"那些将会有条件地跳跃!" 不.这是输出gcc -S -O2:

min_int:
    cmpl    %edi, %esi
    movl    %edi, %eax
    cmovle  %esi, %eax
    ret

min_float:
    minss   %xmm1, %xmm0
    ret
Run Code Online (Sandbox Code Playgroud)

对于ints你得到一个有条件的移动,对于float你得到的minss,因为编译器非常聪明.不需要内联ASM!

编辑:如果你仍然对如何使用内联汇编感到好奇,这里有一个例子(对于gcc):

float
min_float_asm(float a, float b)
{
  float result = a;
  asm ("minss %1, %0" : "+x" (result) : "x" (b));
  return result;
}
Run Code Online (Sandbox Code Playgroud)

x约束意味着"任何SSE寄存器",并"+x"表示该值将被读取和写入,而"x"手段只读.