2013-08-28 105 views
0

我有一個C++函數,恰似:奇怪彙編2008

inline unsigned short function_name(float x, float y, someStruct *cfg) 
{ 
    int x_pos = (int)(x*2 + 0.5f); 
    int y_pos = (int)(y*2 + 0.5f); 

    int dict_index = x_pos + (y_pos * cfg->subdivisions_adj); 

    [...] 

someStruct被聲明爲:

struct someStruct { 
int subdivisions; 
int subdivisions_adj; 
[...] 
} 

用於第三線(int dict_index = [...])所產生的組件是:

cvttss2si edi,xmm3 
imul edi,[ecx+04h] 
movss xmm3,[ecx+0ch] 
movaps xmm4,xmm3 
mulss xmm4,xmm0 
addss xmm4,xmm1 
cvttss2si eax,xmm4 
add edi,eax 

(另請參閱result by AMDCodeAnalyst

任何人都可以解釋這個組件做什麼?我不知道爲什麼使用cvttss2simovaps,他們不是用於浮點數嗎?

我在Windows 7上使用Visual Studio 2008,並啓用了SSE2指令集。

+0

但他們做什麼/他們爲什麼需要?我認爲它們主要是用於浮點數 – tobspr

+0

但是它們被轉換爲int之前..或者也是在程序集中完成的嗎?我沒有真正的裝配知識。 – tobspr

+0

您可以在[英特爾手冊]中找到他們的工作內容(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html?wapkw=(Intel + Architecture +軟件+開發人員%E2%80%99s +手冊)91) – Michael

回答

2

你所看到的僅僅是編譯器將前三行合併爲一個混合的指令序列。

cvttss2si edi,xmm3 

轉換XMM3作爲float到32位int。推測xmm3包含浮點值y_pos,這是y_pos的計算結果(int)

imul edi,[ecx+04h] 

乘以cfg->subdivisions_adj(ECX = CFG,subdivisions_adj = 4偏移)

movss xmm3,[ecx+0ch] 

會的一部分......在你cfg變量,我想。

movaps xmm4,xmm3 
mulss xmm4,xmm0  
adss xmm4,xmm1 

計算X_POS = X * 2 + 0.5

cvttss2si eax,xmm4 

(INT)X_POS;

add edi,eax 

將x_pos添加到y_pos * cfg-> subdivisions_adj;

+0

謝謝!以前漂浮。現在它對我更有意義:) – tobspr