Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc中内联程序集中的最小值_Gcc_Assembly_X86_Sse - Fatal编程技术网

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;
}