2011-03-19 70 views
0

我正在處理涉及SSE內部函數和XMM寄存器的項目,並且我想使用提供的所有16個寄存器。我試圖明確告訴編譯器這樣做,但似乎沒有工作。舉例來說,我可能會寫這樣一行:C:試圖將變量存儲在特定的XMM寄存器中

register __m128 foo __asm__("xmm12") = _mm_setzero_ps(); 

foo將被存儲在寄存器xmm12,和(我以後會增加FOO等)

的事情是被初始化爲零,當我查看彙編代碼時,即使在代碼中實際需要xmm12,但我仍然告訴編譯器使用該寄存器。

我很難搞清楚我做錯了什麼。我的語法不正確?編譯器是否忽略了我在說什麼,如果是這樣,爲什麼?

任何幫助將非常感謝!

+0

對不起,不熟悉這個主題,但我相信你應該告訴你正在使用哪個編譯器 - 「asm」語法往往取決於這一點。 – Mat 2011-03-19 16:42:08

+1

您正在編譯64位代碼,我想?對於32位代碼,只有8個XMM寄存器。無論哪種方式,可能沒有理由指定特定的XMM寄存器 - 只需使用內在函數並讓編譯器爲您執行寄存器分配即可。 – 2011-03-19 16:43:50

+0

gcc?如果是,那麼你怎麼稱呼它? – fazo 2011-03-19 16:44:15

回答

0

事實證明,真正的問題不在於'register'關鍵字。編者無視這一點是正確的。這是一個愚蠢的想法。最終,我所要做的就是將我的'for'循環展開比我已經有的更多次。最後,這使我的代碼更快,只是碰巧使用更多的寄存器。我錯誤地認爲「使用更多寄存器會導致更快的代碼」,當註冊使用比其他任何事情都更具副作用時​​。

儘管謝謝你的幫助!

0

我剛剛嘗試了一個gcc 4.2的實驗,它看起來像只能用-O0指定XMM寄存器。只要開啓優化,gcc就會改變寄存器分配。因此,看起來您可以完全控制並手動進行所有優化,只要您使用gcc -O0即可,如果您真的想要,可以讓gcc爲您優化和註冊分配。