2012-10-30 44 views
3

我正在從源代碼編譯python擴展IGRAPH for x64,而不是在發行版中可用的x86。我已經得到這一切在2012 VS整理出來,當我註釋掉在SRC/math.c如下它編譯將內聯ASM轉換爲內聯for x64 igraph

#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

+0

「fxtract」沒有內部函數,因此計劃立即失敗。如果你願意切換你的非長雙精度,你可以用SSE2內在函數很容易地提取指數(順便說一下,它比'fxtract'快很多)。 – harold

回答

2

在64位浮點一般會使用SSE2指令被執行,因爲這些一般都是速度快了很多。這裏唯一的問題是沒有等價於SSE中的fxtract op(通常意味着FPU版本將作爲複合指令實現,因此非常慢)。因此,作爲C函數的實現在x64上可能會更快。

我發現函數有點難以閱讀,但從我可以告訴它正在調用fxtract,然後將一個整數值存儲到long double指向的地址。這意味着長雙將會有一個'部分'未定義的值。盡我所能說上面的代碼組合不應該工作......但是自從我編寫任何x87代碼以來,它已經很長時間了,所以我可能只是生鏽了。

無論如何,該函數似乎是logb的實現,您不會在MSVC中找到它。但是,它可以使用frexp函數按如下方式實現:

long double igraph_logbl(long double x) 
{ 
    int exp = 0; 
    frexpl(x, &exp); 
    return (long double)exp; 
} 
+0

有趣。根據網絡,frexp在純C版中只有雙版本,你必須去cpp才能獲得長雙。 igraph在技術上全是C,我想。 – WildaBeast

+0

@WildaBeast:你從哪裏得到這些信息?一個很大的問題是,SSE2不再存在長時間雙倍存在(並不是說它真的存在......我的意思是什麼尺寸是長雙倍?)......它無論如何都會變成雙倍(至少與VS2012)。 – Goz