2016-10-24 146 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)。