2016-10-24 70 views
0

每個LLVM IR'fcmp'指令是否都有兼容的X86 cmpps指令? 反之亦然?每個X86 cmpps指令(比如說只有寄存器操作數)可以用一個LLVM的'fcmp'指令來描述嗎? 問題的一個棘手部分是NaN's,Inf's,-0.0和其他角落案例如何由每種語言處理。X86'cmpps'指令和LLVM IR'fcmp'指令是否可互換?

回答

1

不是一個完整的答案,因爲我不太瞭解LLVM IR,但這太長了評論。

每個LLVM IR'fcmp'指令是否都有兼容的X86 cmpps指令?

絕對不準確;如果向量的上層元素中存在大量垃圾,則可能會在C抽象機器不會這樣做的MXCSR狀態位中引發無效或非常規異常。

但是對於標量操作數的CMPSS,您可以做所有事情。如果您正在執行標量比較,通常使用UCOMISS來設置標誌,而不是使用CMPSS在目標XMM寄存器中生成0或-1,通常會更好。

有關x86 XMM CMPp/s指令的最佳文檔可在CMPPD entry(按字母順序排列,其他位置參考其表格)中找到。該HTML提取並不完美,請參閱英特爾的PDF格式更好的表格。 (在標籤wiki鏈接。)


如果你需要避免比較操作數,可能是NaN當拋出一個異常,你可能無法使用CMPSS沒有AVX,至少不會有效。 SSE版本只允許前8個謂詞(imm8 = 0..7),其中許多是S(信令)變體,即如果任一操作數是QNAN,則它們會增加#IA。 AVX增加了所有不發信號謂詞的Q(靜音)版本,如UCOMISS


當然,如果你的目標是一個32位的CPU,並且不能承擔SSE支持,你需要使用x87。 (FCOMI,或者如果你甚至不能承擔P6或更新的FCOM)。