2016-10-30 9 views
4

はLLVMで比較命令の種類を説明し"llvm/IR/InstrTypes.h"CmpInst::Predicate型の定義は次のようになります:順序付けられて順序付けられていないものLLVM CmpInst比較命令?

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 
}; 

私は、「注文したと等しい場合」のような(「注文」と「順不同」の述されているものを疑問に思って「より大きい、または等しい」という通常のものと比較して、「順序付けされていない、より大きい、または等しい」場合)。

+0

答えは次のとおりです。http://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean –

答えて

4

あなたはNaNであるかわからない場合は、最後の段落から開始:)

は順序と順序なし浮動小数点の比較は、オペランドの少なくとも一方がNaNであれば、比較の結果が何であるかに異なっています。詳細については、IR lang refのfcmp instructionを参照してください。特に、この文は重要です: "順序はどちらのオペランドもQNANでないことを意味しますが、順序なしとは、いずれかのオペランドがQNAN"であることを意味します。 LLVM(AFAIK)はSNaNをサポートしていないので、lang refがQNaNについて独占的に話し合っている理由に注意してください。

命名の理由は、NaNを浮動小数点数と比較できないためです。 NaNがゼロより小さいか大きいと言うことはできません。したがって、NaNは順序付けられていません。したがって、順序付けられていない比較は、オペランドの1つがNaNであれば真を返します。順序付き比較では、両方のオペランドが数値であるとみなされます。

これはバックグラウンドが必要な場合はwikipedia page on NaNです。簡単に言えば、浮動小数点演算の結果が数値でない場合、NaN(Not a Number)と呼ばれる特別な結果が生成されます。例えば、 `std :: sqrt 'は、負の数の平方根を求めた場合にNaNを生成します。 NaNには2つのバリエーションがあります。 SNaNおよびQNan。ウィキペディアはそれを記述している。あなたの質問の目的のために、あなたはQNaNだけが重要なので、違いを無視することができます。 SNaNはLLVM AFAIKではサポートされていません。

+0

答えをありがとう。 –

関連する問題