3

我正在从源代码编译 python 扩展 IGRAPH for x64 而不是发行版中可用的 x86。我已经在 VS 2012 中对它进行了整理,当我在 src/math.c 中注释如下时它会编译

#ifndef HAVE_LOGBL
long double igraph_logbl(long double x) {
long double res;
/**#if defined(_MSC_VER)
  __asm { fld [x] }
  __asm { fxtract }
  __asm { fstp st }
  __asm { fistp [res] }
 #else
 __asm__ ("fxtract\n\t"
 "fstp  %%st" : "=t" (res) : "0" (x));
 #endif*/
    return res;
 }
#endif

问题是我不太了解 asm,我也不太了解从 x86 到 x64 是否存在问题。据我所见,这是 4 个必须转换为 x64 内在函数的汇编指令的简短片段。

任何指针?走向内在是正确的方式吗?或者它应该是子程序还是纯C?

编辑:如果有人想查看 igraph 扩展链接http://igraph.sourceforge.net/download.html

4

1 回答 1

2

在 x64 中,浮点通常将使用 SSE2 指令执行,因为这些指令通常要快得多。您唯一的问题是 SSE 中没有等效的 fxtract 操作(这通常意味着 FPU 版本将作为复合指令实现,因此非常慢)。因此,在 x64 上实现为 C 函数可能会一样快。

我发现该函数有点难以阅读,但是据我所知,它正在调用 fxtract,然后将整数值存储到 long double 指向的地址。这意味着 long double 将有一个“部分”未定义的值。尽我所能告诉上面的代码汇编不应该工作......但是自从我编写任何 x87 代码以来已经很长时间了,所以我可能只是生疏了。

无论如何,该功能似乎是您在 MSVC 中找不到的logb的实现。但是,它可以使用 frexp 函数实现如下:

long double igraph_logbl(long double x) 
{
    int exp = 0;
    frexpl( x, &exp );
    return (long double)exp;
 }
于 2012-10-30T20:57:43.250 回答