X86 'cmpps' 指令和 LLVM IR 'fcmp' 指令是不是可以互换?

Posted

技术标签:

【中文标题】X86 \'cmpps\' 指令和 LLVM IR \'fcmp\' 指令是不是可以互换?【英文标题】:Are the X86 'cmpps' instruction and the LLVM IR 'fcmp' instruction interchangeable?X86 'cmpps' 指令和 LLVM IR 'fcmp' 指令是否可以互换? 【发布时间】:2016-10-24 22:07:06 【问题描述】:

是否每个 LLVM IR 'fcmp' 指令都有兼容的 X86 cmpps 指令? 反之亦然呢?每个 X86 cmpps 指令(比如只有寄存器操作数)可以用单个 LLVM 'fcmp' 指令来描述吗? 问题的一个棘手部分是每种语言如何处理 NaN、Inf、-0.0 和其他极端情况。

【问题讨论】:

【参考方案1】:

不是一个完整的答案,因为我对 LLVM IR 了解不多,但这对于评论来说太长了。

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

肯定不完全;如果向量的上部元素中存在大量垃圾,您可以在 C 抽象机不会这样做的 MXCSR 状态位中引发 Invalid 或 Denormal 异常。

但是对于标量操作数的 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)。

【讨论】:

以上是关于X86 'cmpps' 指令和 LLVM IR 'fcmp' 指令是不是可以互换?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 LLVM IR 的指令元数据中提取操作数?

LLVM IR:具有可变 BasicBlock 目标的分支指令?

如何在 LLVM IR 的 switch 指令中使用 char*?

从 LLVM IR 获取精确的行/列调试信息

用于遗传编程的基于llvm的代码突变?

什么是有序和无序 LLVM CmpInst 比较指令?