我正在編寫一個編譯器,我必須輸出浮點值分支條件的代碼。例如,要編譯這種類型的代碼:使用Intel SSE執行分支的最佳方式是什麼?
if(a <= b){
//1. DO something
} else {
//2. Do something else
}
當a和b是浮點型變量時。我只需要跳到2,如果條件不是真的,否則會下降到1.我在這裏考慮在編譯器級別考慮1和2中的優化。
我需要一些適用於所有比較運算符>,> =,<,< =,==和!=
我發現進行比較的一種方法是使用CMPLTSD(以及其他關係運算符的等效指令)。但是有了這個,我必須使用一個SSE寄存器,特別是結果,然後我必須將它的值移到通用寄存器(例如eax)上,最後將其與0進行比較。
我還看到UCOMISD指令應該正確地設置標誌,但顯然它不按我想的方式工作。
那麼,處理這樣的代碼的最好方法是什麼?是否有比我擁有的第一個解決方案更好的說明?
最好,我的意思是,這個問題的一般解決方案。如果可能的話,我希望代碼的行爲與整數比較(cmp a,b; jge label)時的行爲相同。當然,我寧願用最快的指令來實現這一點。
最好的辦法*取決於你在做什麼*。如在裏面,'// DO something'塊裏面是什麼? 「最好的方式」通常取決於看整張圖片,而不是試圖逐行翻譯你的代碼。 – jalf 2012-03-04 19:48:43
我在帖子中添加了詳細信息來回答你的兩個問題。 – 2012-03-04 19:56:42
如果你真的想分支,UCOMISD(實際上是SSE2)似乎是答案,它有什麼問題?無序的結果? – harold 2012-03-04 20:02:21