use*_*913 1 x86 assembly gcc sse
至于今天我使用我自己的min()函数(for float和int)基于if但是今天我知道x86有一些操作数为min - 这是
MINSS - 操作数的最小值
我认为如果基于min()例程是有效的并且我非常小心优化,所以我想将自己的例程重写为minss带有内联汇编的版本,
我想找到gcc内联汇编中最有效的版本如何
我需要类似的东西
int min(int a, int b)
{
// minss a, b
//return
}
Run Code Online (Sandbox Code Playgroud)
两个int和float,使用minss操作码和具有最小的序幕和尾声
或者只是使用库版本会更快?虽然我不想使用库min/max并尽可能快地使用它
这是最有效的可能实施的min对intS和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"手段只读.
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |