“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/