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

标签 llvm

“llvm/IR/InstrTypes.h”中的CmpInst::Predicate类型的定义描述了LLVM中比较指令的类型,如下所示:

enum Predicate {
  // Opcode              U L G E    Intuitive operation
  FCMP_FALSE =  0,  ///< 0 0 0 0    Always false (always folded)
  FCMP_OEQ   =  1,  ///< 0 0 0 1    True if ordered and equal
  FCMP_OGT   =  2,  ///< 0 0 1 0    True if ordered and greater than
  FCMP_OGE   =  3,  ///< 0 0 1 1    True if ordered and greater than or equal
  FCMP_OLT   =  4,  ///< 0 1 0 0    True if ordered and less than
  FCMP_OLE   =  5,  ///< 0 1 0 1    True if ordered and less than or equal
  FCMP_ONE   =  6,  ///< 0 1 1 0    True if ordered and operands are unequal
  FCMP_ORD   =  7,  ///< 0 1 1 1    True if ordered (no nans)
  FCMP_UNO   =  8,  ///< 1 0 0 0    True if unordered: isnan(X) | isnan(Y)
  FCMP_UEQ   =  9,  ///< 1 0 0 1    True if unordered or equal
  FCMP_UGT   = 10,  ///< 1 0 1 0    True if unordered or greater than
  FCMP_UGE   = 11,  ///< 1 0 1 1    True if unordered, greater than, or equal
  FCMP_ULT   = 12,  ///< 1 1 0 0    True if unordered or less than
  FCMP_ULE   = 13,  ///< 1 1 0 1    True if unordered, less than, or equal
  FCMP_UNE   = 14,  ///< 1 1 1 0    True if unordered or not equal
  FCMP_TRUE  = 15,  ///< 1 1 1 1    Always true (always folded)
  FIRST_FCMP_PREDICATE = FCMP_FALSE,
  LAST_FCMP_PREDICATE = FCMP_TRUE,
  BAD_FCMP_PREDICATE = FCMP_TRUE + 1,
  ICMP_EQ    = 32,  ///< equal
  ICMP_NE    = 33,  ///< not equal
  ICMP_UGT   = 34,  ///< unsigned greater than
  ICMP_UGE   = 35,  ///< unsigned greater or equal
  ICMP_ULT   = 36,  ///< unsigned less than
  ICMP_ULE   = 37,  ///< unsigned less or equal
  ICMP_SGT   = 38,  ///< signed greater than
  ICMP_SGE   = 39,  ///< signed greater or equal
  ICMP_SLT   = 40,  ///< signed less than
  ICMP_SLE   = 41,  ///< signed less or equal
  FIRST_ICMP_PREDICATE = ICMP_EQ,
  LAST_ICMP_PREDICATE = ICMP_SLE,
  BAD_ICMP_PREDICATE = ICMP_SLE + 1
};

我想知道什么是“有序”和“无序”谓词(例如“如果有序且等于”或“如果无序、大于或等于”与“无符号大于或等于”的普通谓词相比) .

最佳答案

如果您不知道 NaN 是什么,请从最后一段开始:)

如果至少有一个操作数为 NaN,有序和无序浮点比较的比较结果会有所不同。请参阅fcmp instruction在 IR lang 引用中了解更多详细信息。特别是这句话很重要:“有序意味着两个操作数都不是 QNAN,而无序意味着两个操作数都可能是 QNAN”。请注意,LLVM(AFAIK)不支持 SNaN,这就是 lang ref 专门讨论 QNaN 的原因。

这样命名的原因是 NaN 不能与 float 进行比较。你不能说 NaN 小于或大于零。所以 NaN 是无序的。因此,如果操作数之一为 NaN,无序比较将返回 true。有序比较要求两个操作数都是数字。

这是wikipedia page on NaN如果您需要这方面的背景知识。简而言之,当某些浮点计算的结果不是数字时,会生成一个特殊的结果,称为 NaN(Not a Number)。例如,如果您要求负数的平方根,“std::sqrt”会生成 NaN。 NaN 有两种变体。 SNaN 和 QNan。维基百科对此进行了描述。就您的问题而言,您可以忽略差异,因为只有 QNaN 很重要。 LLVM AFAIK 不支持 SNaN。

关于llvm - 什么是有序和无序 LLVM CmpInst 比较指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40327806/

相关文章:

python - llvm 可以从托管语言执行代码吗?

具有符合协议(protocol)的参数的Swift函数

ocaml - LLVM OCaml 绑定(bind)是否包含内在支持?

javascript - 如何在浏览器中将 C++ 编译为 JavaScript?

llvm - 在llvm IR中找到llvm.pow.f64

c++ - 如何在 LLVM pass 中添加一行新代码?

objective-c - 在 iOS 上,当您将 double 传递给需要 [single] float 作为参数的方法时,实际发生了什么?

ios - iOS 上的 char 是有符号的还是无符号的?

c++ - 解析和修改 LLVM IR 代码

llvm - 无法制作 gnat-llvm : Ada. Strings.Text_Output”不是预定义的库单元