每个LLVM IR'fcmp'指令是否都有兼容的X86 cmpps指令? 反之亦然?是否可以使用单个LLVM“fcmp”指令描述每个X86 cmpps指令(仅使用寄存器操作数)? 问题的棘手部分是NaN,Inf,-0.0和其他角落案例是如何处理的。
答案 0 :(得分:1)
由于我对LLVM IR知之甚少,不是一个完整的答案,但这对评论来说太长了。
每个LLVM IR'fcmp'指令是否都有兼容的X86 cmpps指令?
绝对不完全;如果向量的上层元素中存在高垃圾,则可以在MX抽象机器不会这样做的MXCSR状态位中引发无效或非正常异常。
但是使用CMPSS作为标量操作数,你可以做任何事情。如果您正在进行标量比较,通常最好使用UCOMISS来设置标志,而不是使用CMPSS在目标XMM寄存器中生成0或-1。
x86 XMM CMPp / s指令的最佳文档位于CMPPD entry下(按字母顺序排在第一位;其他指的是其表)。 HTML摘录并不完美,请参阅英特尔的PDF以获得更好格式的表格。 (x86标签wiki中的链接。)
如果在比较可能是NaN的操作数时需要避免引发异常,则可能无法在没有AVX的情况下使用CMPSS,至少效率不高。 SSE版本仅允许前8个谓词(imm8 = 0..7),并且其中许多是S(信令)类型,即如果任一操作数是QNAN,它们会引发#IA
。 AVX添加了所有不发信号的谓词的Q(安静)版本,如UCOMISS。
当然,如果您的目标是32位CPU且无法承担SSE支持,则需要使用x87。 (FCOMI,或者如果你甚至不能假设P6或更新,FCOM)。