gcc中内联程序集中的最小值
至于今天,我使用了自己的gcc中内联程序集中的最小值,gcc,assembly,x86,sse,Gcc,Assembly,X86,Sse,至于今天,我使用了自己的min()函数(用于float和int) 这是基于if的,但今天我知道x86有一些操作数 对于min-这是 MINSS-操作数的最小值 我认为基于if的min()例程是反作用的 我非常小心的优化,所以我想重写我自己的 将例程转换为分钟版本,带有一些内联程序集 我想找出最有效的版本是如何在 gcc内联程序集看起来像 我需要像这样的东西 int min(int a, int b) { // minss a, b //return } 对于int和float,使用
min()
函数(用于float
和int
)
这是基于if的,但今天我知道x86有一些操作数
对于min-这是
MINSS-操作数的最小值
我认为基于if的min()
例程是反作用的
我非常小心的优化,所以我想重写我自己的
将例程转换为分钟
版本,带有一些内联程序集
我想找出最有效的版本是如何在
gcc内联程序集看起来像
我需要像这样的东西
int min(int a, int b)
{
// minss a, b
//return
}
对于int
和float
,使用mins
操作码,并具有最小的开场白和
结语
或者仅仅使用库版本会更快?虽然我想
为了不使用库最小值/最大值并尽可能快地使用它,我建议不要使用这种微优化。如果您仍然想这样做,GCC有一些内置函数。一个是。还有其他
min*
内置,请查看文档
使现代化
为了获得更大的可移植性,您可能需要查看。这些函数通常也由GCC和Clang支持。好吧,我建议不要进行这种微观优化。如果您仍然想这样做,GCC有一些内置函数。一个是。还有其他
min*
内置,请查看文档
使现代化
为了获得更大的可移植性,您可能需要查看。这些函数通常也由GCC和Clang支持。以下是
int
s和float
s的min
最有效的实现:
int
min_int(int a, int b)
{
return a < b ? a : b;
}
float
min_float(float a, float b)
{
return a < b ? a : b;
}
对于int
s,您将获得有条件的移动;对于float
s,您将获得min
,因为编译器非常智能。不需要内联ASM
编辑:如果您仍然对如何使用内联汇编感到好奇,下面是一个示例(对于gcc):
x
约束意味着“任何SSE寄存器,“+x”
意味着该值将被读取和写入,而“x”
意味着只读。以下是int
s和float
s的min
最有效的可能实现方式:
int
min_int(int a, int b)
{
return a < b ? a : b;
}
float
min_float(float a, float b)
{
return a < b ? a : b;
}
对于int
s,您将获得有条件的移动;对于float
s,您将获得min
,因为编译器非常智能。不需要内联ASM
编辑:如果您仍然对如何使用内联汇编感到好奇,下面是一个示例(对于gcc):
x
约束表示“任何SSE寄存器,“+x”
表示该值将被读取和写入,而“x”
表示只读。我认为只使用编译器的SSE enable标志更好。编译器知道的信息比我们多得多。我不知道为什么这个问题会被否决+1我认为只使用编译器的sse enable标志要好得多。编译器知道的信息比我们多得多。我不知道为什么这个问题会被否决+1了解了一些intrinsics,但询问了inlineassembly@user2214913:我认为这是的一个实例,因此我建议要么完全避免这种微观优化,要么使用内在函数。了解一些内在函数,但询问内联函数assembly@user2214913当前位置我认为这是,因此,我建议要么完全避免这种微优化,要么使用内在函数。@user2214913我添加了一个示例。在内联程序集中,result
和b
是否应同时位于输入列表和输出列表中?它们用作r/w.mins
的源操作数可以是内存或寄存器,因此您可以使用“xm”(b)
为编译器提供选项。(但是叮当声有时会无缘无故地溢出到内存中)是的,但是如果您想让编译器更好地优化代码,只需执行返回a
:)@user2214913我添加了一个示例。在内联程序集中,result
和b
是否应同时位于输入列表和输出列表中?它们用作r/w.mins
的源操作数可以是内存或寄存器,因此您可以使用“xm”(b)
为编译器提供选项。(但是叮当声有时会无缘无故地溢出到内存中)是的,但是如果您想让编译器更好地优化代码,只需执行返回a:)
float
min_float_asm(float a, float b)
{
float result = a;
asm ("minss %1, %0" : "+x" (result) : "x" (b));
return result;
}